You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Pandas中含多字典列表的列展开为多列?

展开DataFrame中嵌套字典列表列的方法

针对你提到的handling_unit列(包含空列表或多个字典的列表),可以用以下两种方法展开成handling_unit1、handling_unit1_quantity这类命名的多列:

方法一:自定义函数逐行处理(简洁直观)

这种方法通过自定义函数提取每个字典的目标字段,生成带序号的列,适合中小数据集:

import pandas as pd

# 模拟你的数据(实际使用时替换为你的DataFrame)
data = {
    'handling_unit': [
        [{'id': 87, 'handling_unit': 'tyu', 'quantity': 10}],
        [],
        [],
        [{'id': 88, 'handling_unit': 'tyu', 'quantity': 20}, {'id': 89, 'handling_unit': 'abc', 'quantity': 30}],
        [{'id': 141, 'handling_unit': 'kakjfkls', 'quantity': 15}],
        [{'id': 146, 'handling_unit': 'tyu', 'quantity': 5}],
        [{'id': 148, 'handling_unit': 'ff', 'quantity': 25}],
        [{'id': 155, 'handling_unit': 'kakjfkls', 'quantity': 35}],
        [{'id': 156, 'handling_unit': 'hellow', 'quantity': 40}],
        [{'id': 159, 'handling_unit': 'time pass', 'quantity': 12}],
        [{'id': 162, 'handling_unit': 'tyu', 'quantity': 8}],
        [{'id': 195, 'handling_unit': 'undefined', 'quantity': 0}],
        []
    ]
}
df = pd.DataFrame(data)

# 定义处理函数:提取每个字典的handling_unit和quantity,按序号命名
def expand_units(row):
    result = {}
    for idx, unit_dict in enumerate(row['handling_unit'], 1):
        result[f'handling_unit{idx}'] = unit_dict.get('handling_unit')
        result[f'handling_unit{idx}_quantity'] = unit_dict.get('quantity')
    return pd.Series(result)

# 应用函数并合并到原DataFrame
expanded_df = df.join(df.apply(expand_units, axis=1))

# 可选:删除原handling_unit列
expanded_df = expanded_df.drop('handling_unit', axis=1)

执行后,原列表中有n个字典的行,会生成2n个对应列;空列表的行对应列值为NaN,可根据需求用expanded_df.fillna(0)或expanded_df.fillna('')填充。

方法二:Explode+Pivot(高性能)

如果你的数据集较大,推荐用这种方法,先拆分每行的字典为单独行,再转成宽表:

import pandas as pd

# 沿用上面的df数据
df_exploded = df.explode('handling_unit').reset_index()

# 处理空列表的情况(转成空字典)
df_exploded['handling_unit'] = df_exploded['handling_unit'].apply(lambda x: x if isinstance(x, dict) else {})

# 给同一行的字典加序号(从1开始)
df_exploded['unit_order'] = df_exploded.groupby('index').cumcount() + 1

# 提取目标字段
df_exploded['unit_name'] = df_exploded['handling_unit'].apply(lambda x: x.get('handling_unit'))
df_exploded['unit_qty'] = df_exploded['handling_unit'].apply(lambda x: x.get('quantity'))

# 转成宽表并重命名列
expanded_df = df_exploded.pivot(
    index='index',
    columns='unit_order',
    values=['unit_name', 'unit_qty']
)
expanded_df.columns = [
    f'handling_unit{col[1]}' if col[0] == 'unit_name' else f'handling_unit{col[1]}_quantity'
    for col in expanded_df.columns
]
expanded_df = expanded_df.reset_index(drop=True)

这种方法避免了逐行apply的性能瓶颈,处理大数据集更高效。

内容的提问来源于stack exchange,提问作者Rahul Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:05:37