如何在Pandas中合并age=14与15的行并求和,保留为age=14?
问题解决:合并指定age行并求和
原始数据
import pandas as pd data = {'age' :[10,11,12,11,11,10,11,13,13,13,14,14,15,15,15], 'num1':[10,11,12,13,14,15,16,17,18,19,20,21,22,23,24], 'num2':[20,21,22,23,24,25,26,27,28,29,30,31,32,33,34]} df = pd.DataFrame(data)
需求说明
- 将
age为14和15的行的num1、num2列分别求和 - 求和结果作为
age=14的一行保留 - 其余行保持不变
错误尝试代码
用户原代码存在语法与逻辑错误,无法实现需求:
df1 =df.groupby(age[age >=14])['num1', 'num2'].apply(', '.join).reset_index(drop=True).to_frame()
正确实现方法
方法一:拆分-聚合-拼接
逻辑清晰,适合新手理解:
# 1. 保留age不为14、15的原始行 non_target_rows = df[~df['age'].isin([14, 15])] # 2. 对age为14、15的行求和,设置age固定为14 target_sum = df[df['age'].isin([14, 15])].agg({ 'age': lambda x: 14, 'num1': 'sum', 'num2': 'sum' }).to_frame().T # 3. 拼接两部分数据,重置索引并修改列名 final_result = pd.concat([non_target_rows, target_sum], ignore_index=True) final_result = final_result.rename(columns={'num1': 'time1', 'num2': 'time2'}) print(final_result)
方法二:自定义分组键聚合
通过分组键将14和15归为一组,一次性完成处理:
# 构造分组键:把age=15替换为14,其他age保持不变 group_key = df['age'].replace(15, 14) # 分组处理:14组求和,其他组保留原行 final_result = df.groupby(group_key, group_keys=False).apply( lambda group: group[['num1', 'num2']].sum().to_frame().T.assign(age=14) if group['age'].iloc[0] == 14 else group ).reset_index(drop=True) # 修改列名匹配需求 final_result = final_result.rename(columns={'num1': 'time1', 'num2': 'time2'}) print(final_result)
最终输出
两种方法都会得到符合需求的结果:
age time1 time2 0 10 10 20 1 11 11 21 2 12 12 22 3 11 13 23 4 11 14 24 5 10 15 25 6 11 16 26 7 13 17 27 8 13 18 28 9 13 19 29 10 14 110 160
内容的提问来源于stack exchange,提问作者mehmo
相关产品推荐
相关产品推荐

