Pandas 如何解析df列中的嵌套列?

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':

有没有一种聪明的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': '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;将其添加到解决方案中,我认为应用程序的性能不如列表/目录理解。谢谢你的回答