如何基于ID分组条件修改pandas DataFrame中pp列的数值?
解决方法
核心逻辑是筛选出每个ID分组的非最后一行,将这些行的pp值统一设为0即可,你可以用duplicated方法一行代码实现:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'ID': [1,1,1,2,2,2,3,3,3,3,4], 'pp': [1,1,1,0,0,0,1,1,1,1,0] }) # 核心代码:仅保留每个ID分组最后一行的pp原值,其余行pp设为0 df.loc[df.duplicated('ID', keep='last'), 'pp'] = 0
运行后输出的df和要求的结果完全一致:
ID pp 0 1 0 1 1 0 2 1 1 3 2 0 4 2 0 5 2 0 6 3 0 7 3 0 8 3 0 9 3 1 10 4 0
方法说明
df.duplicated('ID', keep='last')会对重复的ID行返回True,keep='last'参数表示保留每个ID的最后一行为非重复状态(返回False),因此只要把返回True的行对应的pp值设为0,就能实现需求。
如果需要用分组的写法也可以用groupby实现,效果相同:
df['pp'] = df['pp'] * df.groupby('ID').cumcount(ascending=False).eq(0).astype(int)
这个写法是按ID倒序计数,每个分组的最后一行计数值为0,和原值相乘后只有最后一行保留原有pp值,其余行结果为0。
内容的提问来源于stack exchange,提问作者Sht
相关产品推荐
相关产品推荐

