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
相关产品推荐
相关产品推荐

