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

Python pandas按条件对同Id行的a、b、c列求和 仅日期不同时执行

Pandas 分组处理实现方案

以下是符合需求的完整实现逻辑:

实现步骤

  • 先将d列转换为datetime类型,避免字符串格式的日期比较出错
  • 按Id列对DataFrame分组
  • 自定义分组处理函数:判断当前分组内d列的唯一值数量,大于1则对a、b、c三列求和,d取分组第一条的日期;等于1则直接返回分组第一条记录

完整代码

import pandas as pd
# 构造示例数据,实际使用时可替换为pd.read_csv()等读取自己数据的代码
df = pd.DataFrame({
    'Id': ['x', 'x', 'y', 'y'],
    'a': [1, 1, 1, 1],
    'b': [1, 1, 1, 1],
    'c': [1, 0, 1, 1],
    'd': ['01/01/2021', '01/05/2021', '02/01/2021', '02/01/2021']
})
# 转换d列为日期格式,如果你的日期是日/月/年的格式,把format改成'%d/%m/%Y'即可
df['d'] = pd.to_datetime(df['d'], format='%m/%d/%Y')
# 定义分组处理函数
def handle_group(group):
    if group['d'].nunique() > 1:
        # 日期不同,对a/b/c求和,取分组第一条的日期
        return pd.Series({
            'a': group['a'].sum(),
            'b': group['b'].sum(),
            'c': group['c'].sum(),
            'd': group['d'].iloc[0]
        })
    else:
        # 日期全部相同,直接返回分组第一条记录
        return group.iloc[0][['a', 'b', 'c', 'd']]
# 分组应用处理函数
result = df.groupby('Id', as_index=False).apply(handle_group).reset_index(drop=True)
# 可选:把日期列转回原字符串格式
result['d'] = result['d'].dt.strftime('%m/%d/%Y')
print(result)

运行结果

Id  a  b  c           d
0  x  2  2  1  01/01/2021
1  y  1  1  1  02/01/2021

注:你给出的预期输出中x行b列值为1,和求和逻辑(1+1=2)不符,属于示例笔误。如果你实际需求中b列不需要求和,只需要取第一个值,修改handle_group函数中b列的返回值为group['b'].iloc[0]即可。

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:36:03