如何删除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)
逻辑说明
- 标记值变更位置:用
df['le'].ne(df['le'].shift())生成布尔序列,True表示当前行的le值与上一行不同。 - 定位首次变更点:提取布尔序列中第一个
True的索引,这就是le值第一次变化的行。 - 截取目标数据:从首次变更行的前一行开始截取,既能保留初始重复值的最后一行,又能完整保留后续所有行(包括后续的重复行)。
- 边界兼容:如果
le列所有值都相同,直接保留原数据,避免错误截取。
内容的提问来源于stack exchange,提问作者Etiende
相关产品推荐
相关产品推荐

