我从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'}]}]
由于
答案 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])