Pandas DataFrame特定行数值合并:负年龄行bal值累加至同队列零年龄行
嘿,我来帮你搞定这个Pandas的需求!先给你整个示例场景,咱们一步步来操作,保证清晰易懂~
先看示例数据
假设我们的原始DataFrame长这样:
import pandas as pd df = pd.DataFrame({ 'cohort': ['A', 'A', 'A', 'B', 'B', 'B'], 'age': [-1, 0, 2, -2, 0, 3], 'bal': [100, 500, 300, 200, 600, 400] })
这里每个队列(cohort)里有负年龄的行、年龄为0的行,还有正年龄的行,我们要把同队列里负年龄行的余额,全加到年龄为0的行的余额上,最后去掉负年龄的行。
具体操作步骤
1. 计算每个队列的负年龄余额总和
先把每个队列里所有age < 0的行的bal加总,得到每个队列对应的累计值:
# 筛选出age<0的行,按cohort分组求和 neg_bal_sum = df[df['age'] < 0].groupby('cohort')['bal'].sum()
这时候neg_bal_sum是一个Series,索引是cohort,值就是对应队列的负年龄余额总和,比如队列A是100,队列B是200。
2. 把累计值关联到原DataFrame
给原DataFrame加一列,让每一行都能拿到自己所属队列的负年龄余额总和,没有的话填0:
# 用map匹配cohort对应的总和,fillna处理没有负年龄的队列 df['neg_bal_total'] = df['cohort'].map(neg_bal_sum).fillna(0)
3. 更新年龄为0的行的余额
对age == 0的行,把它的bal加上对应的负年龄余额总和;其他行的余额保持不变:
# 用apply逐行判断更新 df['bal'] = df.apply( lambda row: row['bal'] + row['neg_bal_total'] if row['age'] == 0 else row['bal'], axis=1 )
4. 整理最终结果
过滤掉所有age < 0的行,删掉我们临时加的辅助列,再重置索引:
# 过滤+删列+重置索引 result_df = df[df['age'] >= 0].drop('neg_bal_total', axis=1).reset_index(drop=True)
最终结果
运行完上面的代码,result_df就是我们要的样式:
cohort age bal 0 A 0 600 1 A 2 300 2 B 0 800 3 B 3 400
如果你的原始数据里同一个队列有多个age=0的行,这个方法会给每个age=0的行都加上负年龄余额总和;要是你需要把总和合并到某一个age=0的行里,可以再调整分组逻辑,比如先按cohort和age分组求和,再处理就行~
内容的提问来源于stack exchange,提问作者Gaurav Bansal
相关产品推荐
相关产品推荐

