首页 > 解决方案 > 如何使字典键是一列 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。

标签: pythonpandas

解决方案


因为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')

推荐阅读