You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于DataFrame中col1和col2唯一值标记每组最后一行

问题解决:标记DataFrame分组最后一行

原始数据

col1  col2  val
0     1     1    1
1     1     1    2
2     1     1    3
3     1     2    1
4     1     2    2
5     1     2    3
6     2     1    1
7     2     1    2
8     2     2    1

需求

新增final列,标记每个col1和col2组合的最后一行(数据已按col1>col2>val升序排序,最后一行即该组最大val),期望结果:

col1  col2  val  final
0     1     1    1  False
1     1     1    2  False
2     1     1    3   True
3     1     2    1  False
4     1     2    2  False
5     1     2    3   True
6     2     1    1  False
7     2     1    2   True
8     2     2    1   True

无效代码分析

你尝试的循环代码无法生效,是因为df[df["col1"].eq(col1) & df["col2"].eq(col2)].iloc[-1]返回的是原DataFrame的副本,修改副本的final值不会同步到原DataFrame,属于pandas链式赋值的常见问题:

df["final"] = False

for col1 in df["col1"].unique():
    for col2 in df["col2"].unique(): 
        df[df["col1"].eq(col1) & df["col2"].eq(col2)].iloc[-1]["final"] = True

正确实现方法

方法1:groupby + 索引赋值

直接获取每组最后一行的索引,批量赋值:

df["final"] = False
# 提取每组最后一行的索引
last_row_indices = df.groupby(["col1", "col2"]).tail(1).index
# 对指定索引的final列设为True
df.loc[last_row_indices, "final"] = True

方法2:duplicated取反

利用duplicated函数的反向标记,最简洁高效:

# keep="last"保留每组最后一行不被标记为重复,取反后最后一行为True
df["final"] = ~df.duplicated(subset=["col1", "col2"], keep="last")

方法3:groupby + cumcount

通过倒序计数判断是否为最后一行:

# cumcount(ascending=False)给每组行倒序计数,最后一行计数为0
df["final"] = df.groupby(["col1", "col2"]).cumcount(ascending=False) == 0

内容的提问来源于stack exchange,提问作者pointerless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:01:02