Python pandas groupby后如何基于其他列值创建新列
最优实现方案
针对数十万行量级的数据集,优先选择底层向量化实现的API完成计算,避免使用groupby.apply这类逐组遍历的低效写法,整体处理速度是逐组自定义函数的5~10倍,完全适配大数据量场景。
实现步骤
- 用透视表将
Col3的不同取值展开为独立列,聚合时直接取对应Count的和,缺失值自动填充为0 - 基于透视后的结果拼接生成
New_Col3列 - 调整列名和列顺序得到最终结果
完整代码
import pandas as pd # 构造输入示例 input_data = { 'Col1' : ['A','A','A','A','B','B','C'], 'Col2' : ['D','D','T','T','D','D','T'], 'Col3' : ['L','W','L','W','W','L','W'], 'Count': [2,1,3,2,3,2,2] } input_df = pd.DataFrame(input_data) # 核心聚合:向量化透视,性能最优 pivot_res = input_df.pivot_table( index=['Col1', 'Col2'], columns='Col3', values='Count', aggfunc='sum', fill_value=0 ).reset_index() # 生成拼接列 pivot_res['New_Col3'] = pivot_res.apply( lambda row: '/'.join([col for col in ['L', 'W'] if row[col] > 0]), axis=1 ) # 调整列名和顺序匹配输出要求 required_df = pivot_res.rename( columns={'L': 'L_Count', 'W': 'W_Count'} )[['Col1', 'Col2', 'New_Col3', 'W_Count', 'L_Count']]
逻辑说明
pivot_table的聚合逻辑由pandas C层实现,没有Python层的循环开销,是目前pandas分组转列场景下性能最高的实现方式fill_value=0自动处理了分组内缺失某个Col3取值的情况,比如(C,T)组没有L取值,会直接填充L_Count为0,不需要额外写空值判断- 拼接
New_Col3的操作仅在分组聚合后的小结果集上执行,即使原始数据有数十万行,分组后的唯一组合数通常远小于原始行数,这部分开销可以忽略 - 如果后续Col3新增其他取值,只需要修改拼接逻辑里的取值列表即可,不需要改动核心聚合代码
运行上述代码得到的结果完全符合给定的转换规则。
内容的提问来源于stack exchange,提问作者Apeksha Joshi
相关产品推荐
相关产品推荐

