如何在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
相关产品推荐
相关产品推荐

