Pandas如何为已排序DataFrame各分组的最后一行指定列赋值
问题解决:Pandas分组给每组最后一行指定列赋值
错误原因
原有代码报错是因为df.reset_index().groupby('colA').tail(1)返回的是筛选后的子DataFrame对象,不能直接作为.loc的行索引参数使用,且额外调用reset_index属于多余操作。
正确实现
写法1:直接取分组最后一行的原索引赋值
import pandas as pd # 初始化数据 df = pd.DataFrame([['a', 1], ['a', 2], ['b', 1], ['b', 2]], columns=['colA', 'colB']) # 新建colC列赋初始值 df['colC'] = 'Not Current' # 分组取最后一行的原索引,对应赋值 df.loc[df.groupby('colA').tail(1).index, 'colC'] = 'Current'
运行后输出结果如下:
| 序号 | colA | colB | colC |
|---|---|---|---|
| 0 | a | 1 | Not Current |
| 1 | a | 2 | Current |
| 2 | b | 1 | Not Current |
| 3 | b | 2 | Current |
写法2:用分组累计计数做布尔筛选(可选)
如果需要一行完成赋值,可以用分组倒序累计计数判断是否为最后一行:
df['colC'] = df.groupby('colA').cumcount(ascending=False).eq(0).map({True: 'Current', False: 'Not Current'})
两种写法均默认你已提前完成DataFrame的分组内排序,符合你提到的前置条件。
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

