如何将Pandas DataFrame中字典列表列的指定值转换为列名生成宽表
Pandas 字典列表列转宽表实现方案
以下两种方案均可实现需求,可根据数据量选择对应方法:
方法1:字典映射展开法(适合中小数据量)
写法简洁,直接对每行的字典列表做映射转换后展开:
import pandas as pd # 你提供的测试数据生成代码可直接复用 df = pd.DataFrame([[1, [ {'id': 1144801690551941, 'value': 20}, {'id': 8202109018383881, 'value': 26}, {'id': 3025222222235562, 'value': 37}, {'id': 5834245818862827, 'value': 35}, {'id': 4689782481420271, 'value': 27}, {'id': 7385168421196875, 'value': 56}, ]], [2, [ {'id': 1144801690551941, 'value': 25}, {'id': 8202109018383881, 'value': 26}, {'id': 3025222222235562, 'value': 38}, {'id': 5834245818862827, 'value': 35}, {'id': 4689782481420271, 'value': 21}, {'id': 7385168421196875, 'value': 53}, ]], [3, [ {'id': 1144801690551941, 'value': 20}, {'id': 8202109018383881, 'value': 29}, {'id': 3025222222235562, 'value': 37}, {'id': 5834245818862827, 'value': 32}, {'id': 4689782481420271, 'value': 27}, {'id': 7385168421196875, 'value': 50}, ]]], columns=['column1', 'column2']) # 核心转换代码 result = pd.concat([ df['column1'], df['column2'].apply(lambda x: {item['id']: item['value'] for item in x}).apply(pd.Series) ], axis=1)
方法2:展开透视法(适合大数据量)
采用Pandas向量化操作,避免行级循环开销,数据量越大性能优势越明显:
result = df.explode('column2') \ .assign( id=lambda x: x['column2'].str['id'], value=lambda x: x['column2'].str['value'] ) \ .pivot(index='column1', columns='id', values='value') \ .reset_index() # 清除pivot生成的列名索引标记 result.columns.name = None
两种方法输出结果完全一致,均符合预期格式要求。
内容的提问来源于stack exchange,提问作者Pallav Doshi
相关产品推荐
相关产品推荐

