将作为字典的 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 行分隔为列的主要内容,如果未能解决你的问题,请参考以下文章
JSON文件将输出作为每一行的字典,需要从中创建一个DataFrame
将字典键设为行,将字典值设为列,一个值作为列名,一个作为列值