如何将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
相关产品推荐
相关产品推荐

