我有一个数据框,其中一列包含带字典的字符串化列表。我想知道如何从这些字典键中创建新列。
我正在寻找使用pandas方法的解决方案,例如apply stack etc
,尽量不要使用LOOP。
这是问题所在:
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
到目前为止我的尝试
# 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
这给出了多索引数据框。我尝试对字典进行排序,但仍未对其进行排序,并且该列name
没有相同的值。另外,我不确定如何移动column的值name
来替换columncount
并删除其他不需要的列。
speaker views Funny Sad Happy
Einstein 1000 100 110 120
Newton 2000 210 220 200
帮助非常感谢!
更新
我正在使用Pands 0.20,但.explode()
我的工作场所中没有该方法,因此我不允许更新熊猫。
您可以使用sum
,index.repeat
建立一个新的数据帧,并加入它df[['speaker', 'views']]
,并把它分配给df1
。接下来set_index
,unstack
和reset_index
df['ratings'] = df['ratings'].apply(ast.literal_eval)
df1 = (pd.DataFrame(df.ratings.sum(), index=df.index.repeat(df.ratings.str.len()))
.drop('id', 1).join(df[['speaker', 'views']]))
df1.set_index(['speaker', 'views', 'name'])['count'].unstack().reset_index()
Out[213]:
name speaker views Funny Happy Sad
0 Einstein 1000 100 120 110
1 Newton 2000 210 200 220
注意:name
最终输出中是列轴的标签。如果您不想看到它,只需rename_axis
按如下所示附加其他链接
df1.set_index(['speaker', 'views', 'name'])['count'].unstack().reset_index() \
.rename_axis([None], axis=1)
Out[214]:
speaker views Funny Happy Sad
0 Einstein 1000 100 120 110
1 Newton 2000 210 200 220
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句