Pandas 如何解析df列中的嵌套列?
有没有一种聪明的pythonic方法可以将pandas数据框架中的嵌套列解析为3个不同的列?例如,该列可以如下所示:Pandas 如何解析df列中的嵌套列?,pandas,dataframe,parsing,nested,Pandas,Dataframe,Parsing,Nested,有没有一种聪明的pythonic方法可以将pandas数据框架中的嵌套列解析为3个不同的列?例如,该列可以如下所示: col1 [{'name': 'amount', 'value': 1}, {'name': 'frequency', 'value': 2}, {'name': 'freq_unit', 'value': 'month'}] [{'name': 'amount', 'value': 3}, {'name': 'frequency', 'value': 1}, {'name':
col1
[{'name': 'amount', 'value': 1}, {'name': 'frequency', 'value': 2}, {'name': 'freq_unit', 'value': 'month'}]
[{'name': 'amount', 'value': 3}, {'name': 'frequency', 'value': 1}, {'name': 'freq_unit', 'value': 'month'}]
预期结果应为以下三列:
amount frequency freq_unit
1 2 month
3 1 month
这只是第一级。我有2级:如果列表中的元素仍然具有相同的名称(数量、频率和频率单位),但顺序可能会改变,该怎么办?答案中的代码可以处理这个问题吗
col1
[{'name': 'amount', 'value': 1}, {'name': 'frequency', 'value': 2}, {'name': 'freq_unit', 'value': 'month'}]
[{'name': 'amount', 'value': 3}, {'name': 'freq_unit', 'value': 'month'}, {'name': 'frequency', 'value': 1}]
用于复制数据的代码。真的很期待看到社区如何解决这个问题。多谢各位
data = {'col1':[[{'name': 'amount', 'value': 1}, {'name': 'frequency', 'value': 2}, {'name': 'freq_unit', 'value': 'month'}],
[{'name': 'amount', 'value': 3}, {'name': 'frequency', 'value': 1}, {'name': 'freq_unit', 'value': 'month'}]]}
df = pd.DataFrame(data)
和的组合可以在这里提供帮助:
from itertools import chain
from collections import defaultdict
data = defaultdict(list)
phase1 = [[(data["name"], data["value"])
for data in entry]
for entry in df.col1
]
phase1 = chain.from_iterable(phase1)
for key, value in phase1:
data[key].append(value)
pd.DataFrame(data)
amount frequency freq_unit
0 1 2 month
1 3 1 month
上面是冗长的:@piRSquared的评论更简单,有一个列表:
pd.DataFrame([{x["name"]: x["value"] for x in lst} for lst in df.col1])
另一个想法是使用列表理解,结合Pandas的字符串方法,这是非常不必要的:
outcome = [(df.col1.str[num].str["value"]
.rename(df.col1.str[num].str["name"][0])
)
for num in range(df.col1.str.len()[0])
]
pd.concat(outcome, axis = 'columns')
@在我看来,piRsquared的解决方案是最简单的。您可以编写一个函数,解析
系列中的每个单元格,并返回一个格式正确的系列
,然后使用apply将迭代进行压缩:
>>> def custom_parser(record):
... clean_record = {rec["name"]: rec["value"] for rec in record}
... return pd.Series(clean_record)
>>> df["col1"].apply(custom_parser)
amount frequency freq_unit
0 1 2 month
1 3 1 month
您可以将字典列表传递给DataFrame
构造函数,Pandas将把键解析为列名。这也可以工作pd.DataFrame([{x['name']:x['value']代表lst中的x}代表df.col1中的lst])
谢谢@piRSquared;将其添加到解决方案中,我认为应用程序的性能不如列表/目录理解。谢谢你的回答