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

如何在Pandas中按组移除DataFrame连续重复的列值?

按Node分组移除Value列连续重复值的Pandas高效实现

需求说明

按node字段分组,移除value列中连续出现的重复值;非连续的重复值需保留。原循环实现效率极低,需改用Pandas向量化操作优化。

高效实现方案

利用Pandas的groupby+shift+ne组合实现完全向量化处理,彻底避免循环:

方法一:使用transform(推荐,性能更优)

# 生成每个node组内的上一行value
df['prev_value'] = df.groupby('node')['value'].shift()
# 构建筛选掩码:保留组内第一行(prev_value为NaN),或当前value与上一行不同的行
mask = df['value'].ne(df['prev_value']) | df['prev_value'].isna()
# 筛选后删除临时列
df_filtered = df.drop(columns='prev_value')[mask]

方法二:使用apply

# 分组后对每个组的value列,判断当前值与上一行是否不同,组内第一行填充True
mask = df.groupby('node')['value'].apply(lambda x: x.ne(x.shift())).fillna(True)
df_filtered = df[mask]

原理说明

  • groupby('node'):按节点分组,确保仅在同一节点内比较连续值
  • shift():将每个组内的value向上偏移一行,获取当前行的上一行值
  • ne():判断当前值与上一行值是否不相等,返回布尔值
  • prev_value.isna():保留每个组的第一行(因为第一行无前置行,shift()结果为NaN)

效果验证

针对你提供的示例数据:

  • 节点ns=4;i=9的连续33行(第6行)会被过滤
  • 节点ns=4;i=9的连续34行(第9行)会被过滤
  • 非连续的33行(第10行)会被保留
    最终结果与你预期的处理后示例完全一致。

性能优势

相比iterrows()循环,向量化操作基于Pandas底层C优化实现,处理大数据集时速度可提升数十倍甚至上百倍。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:42:53