我有一个熊猫数据框,其中包含几个id字段,另一个字段包含一个需要附加到id字段的附加值的字典。我试图将这本字典中的数据透视起来并使每个条目在现有数据框中都具有自己的单独列
下面的代码实现了我想要的功能,但是速度很慢。有没有更有效的方法来获得相同的结果?
import pandas as pd
# Create sample table
a=[{'Feature1': 'aa1','Feature2': 'bb1','Feature3': 'cc2' },
{'Feature1': 'aa2','Feature2': 'bb2', 'Feature3': 'abc' },
{'Feature1': 'aa1','Feature2': 'cc1', 'Feature3': 'xyz' }
]
b=['num1','num2','num3']
c=['numa', 'numb', 'numc']
df = pd.DataFrame({'id1':b, 'id2':c, 'dic':a })
# Specify fields to construct the empty dataframe
cols = [
'id1',
'id2',
'Feature1',
'Feature2',
'Feature3'
]
results = pd.DataFrame(columns=cols)
# Iterate through each row and grab values
for idx, row in df.iterrows():
id_records = list(row[['id1', 'id2']])
other_vals = list(row['dic'].values())
results.loc[idx] = id_records+other_vals
编辑:在我的实际用例中,某些词典缺少某些键。例如,第二行可能没有“ Feature2”。我希望该字段对于该记录为空。我不确定如何以低效的方式执行此操作。
该代码定义了一些更接近我实际数据的东西。
# Create sample table
a=[{'Feature1': 'aa1','Feature2': 'bb1','Feature3': 'cc2' },
{'Feature1': 'aa2', 'Feature3': 'abc' },
{'Feature1': 'aa1','Feature2': 'cc1', 'Feature3': 'xyz' }
]
b=['num1','num2','num3']
c=['numa', 'numb', 'numc']
df = pd.DataFrame({'id1':b, 'id2':c, 'dic':a })
解:
除了以下解决方案之外,我的实际数据还没有注册为真实词典。它被注册为看起来像字典的字符串。我必须将其转换为字典,然后以下解决方案起作用。
我就是这样
import json
def convert_to_dict(string):
return(json.loads(string))
df['fieldName'] = df.fieldName.apply(convert_to_dict)
完成此操作后,Andy的解决方案对我来说效果很好。
编辑:在您更新的示例。缺少Feature
构造为NaN
df_final = df.drop('dic',1).join(pd.DataFrame.from_dict(df.dic.to_dict(),
orient='index'))
Out[1082]:
id1 id2 Feature1 Feature2 Feature3
0 num1 numa aa1 bb1 cc2
1 num2 numb aa2 NaN abc
2 num3 numc aa1 cc1 xyz
试试这个
df_final = df.drop('dic',1).join(pd.DataFrame.from_dict(df.dic.to_dict(),
orient='index'))
Out[1060]:
id1 id2 Feature1 Feature2 Feature3
0 num1 numa aa1 bb1 cc2
1 num2 numb aa2 bb2 abc
2 num3 numc aa1 cc1 xyz
其他几种不同的方式:
来自@Shubham Sharma:
df_final = df.drop('dic', 1).join(pd.DataFrame(df['dic'].tolist()))
来自@anky:
df_final = df.join(pd.DataFrame(df.pop('dic').tolist()))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句