基于Pandas DataFrame分组生成单条目字典列表的高效实现
Pandas分组生成指定字典列表的高效方案
原始数据
给定如下Pandas DataFrame:
| header1 | header2 |
|---|---|
| First | row1 |
| Second | row2 |
| Third | row1 |
| Fourth | row2 |
| Fifth | row1 |
需求说明
针对header2列值相同的分组:
- 排除每组的第一行
- 每个后续行生成一个单条目字典,键为该组第一行的
header1值,值为当前行的header1值
预期输出:
- 理想输出:
[{"First":"Third"}, {"Second":"Fourth"}, {"First":"Fifth"}] - 简化输出(仅保留每组第一个后续行的映射):
{"First":"Third","Second":"Fourth"}
要求方案具备低计算量,替代嵌套循环实现。
高效实现方案
步骤1:准备数据与分组标记
先给每个分组添加组内行号,用于区分组内首行与后续行:
import pandas as pd # 初始化DataFrame df = pd.DataFrame({ 'header1': ['First', 'Second', 'Third', 'Fourth', 'Fifth'], 'header2': ['row1', 'row2', 'row1', 'row2', 'row1'] }) # 为每个header2分组添加组内行号(从0开始计数) df['group_rank'] = df.groupby('header2').cumcount()
步骤2:映射组首行的header1值
提取每个header2分组的首个header1值,映射到所有行:
# 生成header2到组首header1的映射字典 first_row_map = df[df['group_rank'] == 0].set_index('header2')['header1'].to_dict() # 给所有行添加对应分组的首行header1值 df['group_first'] = df['header2'].map(first_row_map)
步骤3:生成目标字典列表
过滤掉组内首行,逐行生成单条目字典并转换为列表:
# 生成理想输出的字典列表 result = df[df['group_rank'] > 0].apply(lambda x: {x['group_first']: x['header1']}, axis=1).tolist() print(result) # 输出:[{"First":"Third"}, {"Second":"Fourth"}, {"First":"Fifth"}]
简化输出实现
如果只需要每组第一个后续行的映射,直接生成字典即可:
# 生成简化版字典 simplified_result = df[df['group_rank'] == 1].set_index('group_first')['header1'].to_dict() print(simplified_result) # 输出:{"First":"Third","Second":"Fourth"}
方案优势
全程使用Pandas的向量化分组操作,避免了嵌套循环的逐行遍历,计算效率远高于手动循环,尤其在处理大体积数据集时性能提升明显。
内容的提问来源于stack exchange,提问作者Kushal Mohnot
相关产品推荐
相关产品推荐

