pandas按两列子集去重且要求SOURCE列取值不同的实现方法
Pandas自定义去重实现方案
实现逻辑
核心规则可通过分组识别连续相同source段实现:
- 按去重键
po(对应PO字段)、msn(对应PRODUCT_NUMBER字段)分组 - 每个分组内给连续相同的
source段打相同标记,仅保留最后一个连续source段的所有行,既可以删除更早的不同source重复行,也可以保留同source的所有连续行
完整代码
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ "po": [1, 2, 1, 1] , "msn": [111, 222, 111, 111] , "delivery_time": ["2021-09-01", "2021-09-01", "2021-09-05", "2021-09-08"] , "amount": [10, 20, 30, 40] , "source": ["A", "B", "C", "C"]}) # 步骤1:对每个分组的source生成连续段标记 df['source_segment'] = df.groupby(['po', 'msn'])['source'].apply( lambda x: (x != x.shift()).cumsum() ) # 步骤2:仅保留每个分组最后一个source段的所有行 result = df[ df['source_segment'] == df.groupby(['po', 'msn'])['source_segment'].transform('max') ].drop(columns='source_segment') # 输出结果 print(result)
运行结果
po msn delivery_time amount source 1 2 222 2021-09-01 20 B 2 1 111 2021-09-05 30 C 3 1 111 2021-09-08 40 C
完全符合预期输出要求,如果你的实际数据列名是大写的PO、PRODUCT_NUMBER、SOURCE,替换代码中对应列名即可。
内容的提问来源于stack exchange,提问作者Vega
相关产品推荐
相关产品推荐

