You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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']
})

对应的表格形式:

idflagcol_1col_2name
0111113a
1206214b
2101315a
3217416b
4312517c
5302218c

期望输出

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:07:35