因此,我有一个pandas数据框,其中包含相当于字典的数组,而我正在努力将它们变成原始词典中的列。
df3 = pd.DataFrame({'SomeCol':
["[{'Source': 'A', 'Value': '4.7'}]",
"[{'Source': 'A', 'Value': '8.2'},"
"{'Source': 'B', 'Value': '100%'}]",
"[{'Source': 'A', 'Value': '8.1'}, "
"{'Source': 'C', 'Value': '870'},"
"{'Source': 'B', 'Value': '98%'}]",
"[{}]"
],
'Other Stuff': ['One'
, 'Two', 'Three', 'Four'
]
})
我希望得到以下结果
A B C
0 4.7 na na
1 8.2 100% na
2 8.1 98% 870
我尝试过
data.map(eval).apply(pd.Series)
以及主题的多种变化
def f2(x):
df_r = pd.DataFrame()
for i in x:
df_r = pd.DataFrame.from_dict(x, orient='columns')
return df_r
dfa = pd.concat([df3, df3['SomeCol'].map(eval).apply(f2)])
我似乎缺少一些重要的东西。我最接近的是
第一次调用f2函数的结果接近
Source Value
0 A 4.7
0 A 8.2
1 B 100%
0 A 8.1
1 C 870
2 B 98%
但是当我将它们结合在一起时,我会一团糟。仅提供一些有关从此处出发的帮助会有所帮助。最近两天,我都在用一种简单的方法以及一种蛮力在挣扎,而邻居却似乎在削减它。
答案 0 :(得分:2)
您可以使用ast.literal_eval
创建字典以将字符串转换为字典:
import ast
out = [{x.get('Source'):x.get('Value') for x in ast.literal_eval(v)}
for k, v in df3.pop('SomeCol').items()]
print (out)
[{'A': '4.7'}, {'A': '8.2', 'B': '100%'}, {'A': '8.1', 'C': '870', 'B': '98%'}, {None: None}]
然后将其传递给DataFrame
的构造函数,并通过DataFrame.dropna
删除NaN
的列:
df = pd.DataFrame(out, index=df3.index).dropna(how='all', axis=1)
print (df)
A B C
0 4.7 NaN NaN
1 8.2 100% NaN
2 8.1 98% 870
3 NaN NaN NaN
最后DataFrame.join
个原始版本:
df = df3.join(df)
print (df)
Other Stuff A B C
0 One 4.7 NaN NaN
1 Two 8.2 100% NaN
2 Three 8.1 98% 870
3 Four NaN NaN NaN