如何高效删除Pandas DataFrame中无连续重复列值的行?
Efficient Pandas Solution to Filter Rows with Consecutive Duplicates in Column
这里有个高效的Pandas矢量化解法,完全替代效率低下的for循环,一步搞定你的需求:
1. 先构造示例DataFrame(方便复现测试)
import pandas as pd data = { 'col1': [1,2,3,4,5,6,7,8,9,10,11], 'col2': ['A','B','C','D','E','F','G','H','I','J','K'], 'col3': ['P','P','P','P','Q','T','T','T','P','Q','Q'] } df = pd.DataFrame(data)
2. 核心过滤逻辑
利用Pandas的shift()函数实现矢量化对比,避免逐行循环:
# 生成布尔掩码:保留col3与上一行相同 或 与下一行相同的行 mask = (df['col3'] == df['col3'].shift(1)) | (df['col3'] == df['col3'].shift(-1)) # 应用掩码过滤得到目标DataFrame filtered_df = df[mask]
3. 代码逻辑解释
df['col3'].shift(1):将col3的所有元素向下偏移一行,第一行变为NaN,用来对比当前行与上一行的值df['col3'].shift(-1):将col3的所有元素向上偏移一行,最后一行变为NaN,用来对比当前行与下一行的值- 逻辑或
|连接两个条件:只要当前行的col3值和上一行或者下一行相同,就保留该行,自动排除了那些前后都不同的孤立行(比如原数据中的第5行、第9行)
4. 最终结果
运行后filtered_df的输出完全符合你的预期:
col1 col2 col3 0 1 A P 1 2 B P 2 3 C P 3 4 D P 5 6 F T 6 7 G T 7 8 H T 9 10 J Q 10 11 K Q
效率优势
这个方法是Pandas的矢量化操作,底层用C语言实现运算,相比Python层面的for循环,在数据量较大时(比如上万行甚至更多),执行效率会提升几十甚至上百倍,完全符合Pythonic的高效编程风格。
内容的提问来源于stack exchange,提问作者Kallol
相关产品推荐
相关产品推荐

