gpt4 book ai didi

python - 如何使字典键是 Pandas 数据帧的一列到列?

转载 作者:行者123 更新时间:2023-12-04 22:54:28 25 4
gpt4 key购买 nike

我有一个数据框,其中一列包含包含字典的字符串化列表。我想知道如何从这些字典键创建新列。

我正在寻找使用 pandas 方法(例如 apply stack 等)的解决方案,并且尽可能不使用 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')

关于python - 如何使字典键是 Pandas 数据帧的一列到列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57500343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com