我有一个数据框,其中一列包含包含字典的字符串化列表。我想知道如何从这些字典键中创建新列。
我正在寻找使用pandas方法的解决方案,例如“ apply stack etc不使用循环”。
这是问题所在:
speakers = ['Einstein','Newton']
views = [1000,2000]
ratings0 = ("[{'id': 7, 'name': 'Funny', 'count': 100}, {'id': 1, 'name': 'Sad', "
"'count': 110}, {'id': 9, 'name': 'Happy', 'count': 120}]")
ratings1 = ("[{'id': 7, 'name': 'Happy', 'count': 200}, {'id': 3, 'name': 'Funny', "
"'count': 210}, {'id': 2, 'name': 'Sad', 'count': 220}]")
ratings = [ratings0, ratings1]
df = pd.DataFrame({'speaker': speakers, 'ratings': ratings,'views':views})
print(df)
speaker ratings views
0 Einstein [{'id': 7, 'name': 'Funny', 'count': 100}, {'i... 1000
1 Newton [{'id': 7, 'name': 'Happy', 'count': 200}, {'i... 2000
Run Code Online (Sandbox Code Playgroud)
到目前为止我的尝试
# new dataframe only for ratings
dfr = df['ratings'].apply(ast.literal_eval)
dfr = dfr.apply(pd.DataFrame)
dfr = dfr.apply(lambda x: x.sort_values(by='name'))
dfr = dfr.apply(pd.DataFrame.stack)
print(dfr)
0 1 2
count id name count id name count id name
0 100 7 Funny 110 1 Sad 120 9 Happy
1 200 7 Happy 210 3 Funny 220 2 Sad
Run Code Online (Sandbox Code Playgroud)
这给出了多索引数据帧。我尝试对字典进行排序,但仍未对其进行排序,并且该列name没有相同的值。另外,我不确定如何移动column的值name来替换column count并删除其他不需要的列。
speaker views Funny Sad Happy
Einstein 1000 100 110 120
Newton 2000 210 220 200
Run Code Online (Sandbox Code Playgroud)
帮助非常感谢!
更新
我正在使用Pands 0.20,但.explode()我的工作场所中没有该方法,因此我不允许更新熊猫。
对于pandas >= 0.25.0您可以使用ast.literal_eval+ explode+pivot
ii = df.set_index('speaker')['ratings'].apply(ast.literal_eval).explode()
u = pd.DataFrame(ii.tolist(), index=ii.index).reset_index()
u.pivot('speaker', 'name', 'count')
Run Code Online (Sandbox Code Playgroud)
name Funny Happy Sad
speaker
Einstein 100 120 110
Newton 210 200 220
Run Code Online (Sandbox Code Playgroud)
对于旧版本 pandas
a = df['speaker']
b = df['ratings']
ii = [
{**{'speaker': name}, **row}
for name, element in zip(a, b) for row in ast.literal_eval(element)
]
pd.DataFrame(ii).pivot('speaker', 'name', 'count')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |