单独的pd DataFrame将字典排成列

时间:2018-04-12 09:16:39

标签: python python-3.x pandas dictionary dataframe

我从API中提取一些数据并遇到挑战,将其转换为适当的数据帧。

生成的DataFrame df按如下方式排列:

Index      Column
0    {'email@email.com': [{'action': 'data', 'date': 'date'}, {'action': 'data', 'date': 'date'}]}
1    {'different-email@email.com': [{'action': 'data', 'date': 'date'}]}

我正在尝试将电子邮件拆分为一列,将列表拆分为单独的列:

Index      Column1         Column2
0    email@email.com      [{'action': 'data', 'date': 'date'}, {'action': 'data', 'date': 'date'}]}

理想情况下,每个动作' /'日期'会有它自己独立的排,但我相信我可以自己进一步打开包装。

环顾四周后,我尝试了许多解决方案,例如:

df.apply(pd.Series) # does nothing
pd.DataFrame(df['column'].values.tolist()) # makes each dictionary key as a separate colum 
where most of the rows are NaN except one which has the pair value

编辑:

由于许多问题都询问了API中数据的初始格式,因此它是一个词典列表:

[{'email@email.com': [{'action': 'data', 'date': 'date'}, {'action': 'data', 'date': 'date'}]},{'different-email@email.com': [{'action': 'data', 'date': 'date'}]}]

由于

2 个答案:

答案 0 :(得分:1)

这样做的一种天真的方式如下:

inp = [{'email@email.com': [{'action': 'data', 'date': 'date'}, {'action': 'data', 'date': 'date'}]}
 , {'different-email@email.com': [{'action': 'data', 'date': 'date'}]}]
index = 0
df = pd.DataFrame()
for each in inp: # iterate through the list of dicts
    for k, v in each.items(): #take each key value pairs
        for eachv in v: #the values being a list, iterate through each
            print (str(eachv))
            df.set_value(index,'Column1',k)
            df.set_value(index,'Column2',str(eachv))
            index += 1

我相信可能有更好的方式来写这个。希望这会有所帮助:)

答案 1 :(得分:0)

假设您已将其作为数据框读取,则可以使用以下 -

import ast
df['Column'] = df['Column'].apply(lambda x: ast.literal_eval(x))
df['email'] = df['Column'].apply(lambda x: x.keys()[0])
df['value'] = df['Column'].apply(lambda x: x.values()[0])