将作为字典的 pd DataFrame 行分隔为列

Posted

技术标签:

【中文标题】将作为字典的 pd DataFrame 行分隔为列【英文标题】:Separate pd DataFrame Rows that are dictionaries into columns 【发布时间】:2018-09-22 09:02:08 【问题描述】:

我正在从 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']]

谢谢

【问题讨论】:

提取数据时可以直接使用pd.DataFrame.from_dict() 忘了提到一个 - 也不做任何事情,也尝试使用 orient = 'index' ,这会给出以下错误。 'AttributeError: 'list' object has no attribute 'values'' 我应该提到初始数据与每一行作为列表中的一个项目。 您能否以原始格式而不是数据框发布数据样本。 你是如何把你的 DataFrame 做成那种格式的?问题可能出在您从原始数据到 DataFrame 的位置 @DBa 类似于:pd.DataFrame('email': k, **el for dct in data for k, v in dct.items() for el in v) 你在追求什么? 【参考方案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

我相信可能有更好的方法来写这篇文章。希望这会有所帮助:)

【讨论】:

谢谢!您的解决方案也有效,但是有人发布了一个更简单的版本:)(会投票,但我还没有足够的代表)。但是,作为注释,我收到以下警告:'FutureWarning: set_value 已弃用,将在未来版本中删除。请改用 .at[] 或 .iat[] 访问器,这很容易修复【参考方案2】:

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

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])

【讨论】:

在第一个 .apply 上返回以下错误 'ValueError: malformed node or string:' 这意味着你所有的字符串都不是'key : value'形式

以上是关于将作为字典的 pd DataFrame 行分隔为列的主要内容,如果未能解决你的问题,请参考以下文章

将 Pandas DataFrame 的行作为字典进行迭代

JSON文件将输出作为每一行的字典,需要从中创建一个DataFrame

python如何将双字典变成制表符分隔文件[重复]

将字典键设为行,将字典值设为列,一个值作为列名,一个作为列值

将字典值增量添加到 pandas DataFrame。具有dict键列名的DataFrame

python:DataFrame转dict字典