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

如何删除pd.DataFrame某列首次变更前的重复行(保留最后一行)

解决方案

需求说明

有大量结构如下的pandas DataFrame,需要删除le列首次值变更之前的所有行,但保留该初始重复值的最后一行(比如示例中删除前两行,保留第三行及之后的所有行),同时不能误删后续出现的重复行。

示例原数据:

id     no     parent  le               dia
10     1           1  9.18359371679495  112.963635499912           
10     1           1  9.18359371679495  102.261060580237            
10     1           1  9.18359371679495  102.261060580237        
10     1           1   46.531309334225  75.1405324759379           
10     1           1   148.45737705256  68.9880315000758           
10     1           1  266.349709386555  68.9880315000758
10     1           1   352.40977395104  68.9880315000758        
10     1           1   352.40977395104  68.9880315000758       
10     1           1   352.40977395104  68.9880315000758 

期望结果:

id     no     parent  le                dia
10     1           1  9.18359371679495  102.261060580237        
10     1           1   46.531309334225  75.1405324759379           
10     1           1   148.45737705256  68.9880315000758           
10     1           1  266.349709386555  68.9880315000758
10     1           1   352.40977395104  68.9880315000758        
10     1           1   352.40977395104  68.9880315000758       
10     1           1   352.40977395104  68.9880315000758            

通用代码实现

import pandas as pd

# 示例数据构造(实际使用时替换为你的DataFrame)
data = {
    'id': [10]*9,
    'no': [1]*9,
    'parent': [1]*9,
    'le': [9.18359371679495]*3 + [46.531309334225, 148.45737705256, 266.349709386555] + [352.40977395104]*3,
    'dia': [112.963635499912, 102.261060580237, 102.261060580237, 75.1405324759379, 68.9880315000758, 68.9880315000758, 68.9880315000758, 68.9880315000758, 68.9880315000758]
}
df = pd.DataFrame(data)

# 核心处理逻辑
# 标记每行是否与前一行的le值不同
change_mask = df['le'].ne(df['le'].shift())
# 找到第一次发生值变更的行索引
first_change_idx = change_mask[change_mask].index.min()

if first_change_idx is not None:
    # 保留从首次变更行的前一行开始到末尾的所有数据
    result_df = df.loc[first_change_idx - 1:]
else:
    # 若le列所有值都相同,直接保留原数据
    result_df = df.copy()

# 查看结果
print(result_df)

逻辑说明

  1. 标记值变更位置:用df['le'].ne(df['le'].shift())生成布尔序列,True表示当前行的le值与上一行不同。
  2. 定位首次变更点:提取布尔序列中第一个True的索引,这就是le值第一次变化的行。
  3. 截取目标数据:从首次变更行的前一行开始截取,既能保留初始重复值的最后一行,又能完整保留后续所有行(包括后续的重复行)。
  4. 边界兼容:如果le列所有值都相同,直接保留原数据,避免错误截取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:01:16