python - 如何使字典键是一列 Pandas 数据框的列?
问题描述
我有一个数据框,其中一列包含包含字典的字符串化列表。我想知道如何从这些字典键中创建新列。
我正在寻找使用 pandas 方法的解决方案apply stack etc
,比如尽可能不使用 FOR 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
没有相同的值。另外,我不确定如何移动列的值name
以替换列count
并删除其他不需要的列。
最终通缉解决方案
speaker views Funny Sad Happy
Einstein 1000 100 110 120
Newton 2000 210 220 200
更新
我正在使用 Pandas 0.20,.explode()
我的工作场所没有该方法,并且不允许我更新 Pandas。
解决方案
因为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')
name Funny Happy Sad
speaker
Einstein 100 120 110
Newton 210 200 220
对于旧版本的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')
推荐阅读
- css - 对带有 XSLT 的样式表使用相对 href 不适用于 macOS WebView (Xamarin.Forms 5.x)
- python - 你可以直接定义 __doc__ 吗?
- winforms - WinForms:DevExpress:GridView:鼠标双击打开表单
- redirect - 如何将流量重定向到 cisco 交换机 3750 上的另一个接口?
- r - 如果满足特定条件,则删除数据框中的行,同时更新关联的总值
- mysql - 如何显示结果 - MySQL 问题
- amazon-web-services - ListSamlProvidersRequestinput 不存在吗?
- c++ - 我不明白命令设计模式在游戏开发中的工作原理
- java - 即使我有一个 liquibase.properties 文件,也没有指定数据库 URL
- amazon-s3 - 如何使用node.js直接在lambda函数中将pdf文件从http url复制/下载到S3,而无需下载到本地