Pandas按id和name分组,计算不同flag的列值差值
按分组计算指定列的flag差值解决方案
原始数据
import pandas as pd df = pd.DataFrame({ 'id': [1,2,1,2,3,3], 'flag': [1,0,0,1,1,0], 'col_1': [11,62,13,74,25,22], 'col_2': [13,14,15,16,17,18], 'name': ['a','b','a','b','c','c'] })
对应的表格形式:
| id | flag | col_1 | col_2 | name | |
|---|---|---|---|---|---|
| 0 | 1 | 1 | 11 | 13 | a |
| 1 | 2 | 0 | 62 | 14 | b |
| 2 | 1 | 0 | 13 | 15 | a |
| 3 | 2 | 1 | 74 | 16 | b |
| 4 | 3 | 1 | 25 | 17 | c |
| 5 | 3 | 0 | 22 | 18 | c |
期望输出
id col_3 col_4 name 0 1 2 2 a 1 2 -12 -2 b 2 3 -3 1 c
实现代码
方法一:使用pivot_table(简洁高效)
# 分组并将flag转换为列,提取对应数值 pivoted_df = df.pivot_table( index=['id', 'name'], columns='flag', values=['col_1', 'col_2'], aggfunc='first' # 假设每组内每个flag仅对应一条数据 ) # 计算flag=0与flag=1的差值,构造结果DataFrame result_df = pd.DataFrame({ 'col_3': pivoted_df['col_1'][0] - pivoted_df['col_1'][1], 'col_4': pivoted_df['col_2'][0] - pivoted_df['col_2'][1] }).reset_index() # 调整列顺序匹配期望格式 result_df = result_df[['id', 'col_3', 'col_4', 'name']] print(result_df)
方法二:使用groupby+apply(逻辑直观)
def compute_group_diff(group): # 提取组内flag=0和flag=1的单条数据 flag_0 = group[group['flag'] == 0].iloc[0] flag_1 = group[group['flag'] == 1].iloc[0] # 返回计算后的差值 return pd.Series({ 'col_3': flag_0['col_1'] - flag_1['col_1'], 'col_4': flag_0['col_2'] - flag_1['col_2'] }) # 按id和name分组执行差值计算 result_df = df.groupby(['id', 'name']).apply(compute_group_diff).reset_index() # 调整列顺序 result_df = result_df[['id', 'col_3', 'col_4', 'name']] print(result_df)
逻辑说明
两种方法均基于按id和name分组的核心前提,确保同一组内是同id同名的记录;最终实现每组内flag=0的col_1/col_2值减去flag=1的对应值。
- 方法一通过
pivot_table转换数据结构,直接用列运算完成差值计算,执行效率更高; - 方法二通过自定义函数处理单组数据,逻辑更清晰,适合理解分组计算的过程。
内容的提问来源于stack exchange,提问作者Vyshnavi
相关产品推荐
相关产品推荐

