基于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
相关产品推荐
相关产品推荐

