如何在Pandas DataFrame中筛选Serial No.相同且Shipment与日期均不同的记录
Pandas 筛选满足特定分组条件的记录
原始数据
用户提供的初始DataFrame如下:
import pandas as pd df = pd.DataFrame({ 'Shipment': ['Washington','Green Gala', 'Green Gala','Dale', 'Chiquita'], 'Source': ['USA', 'SA','NZ', 'GU','EQ'], 'Serial No.': ['01','01','01','02','02'], 'Freight type': ['Truck','Air','Sea','Sea','Sea'], 'Shipment date': ['2020-01-01','NULL','2020-01-02','2020-02-01','2020-02-01'] })
筛选需求
需要保留的记录需满足:同一Serial No.分组内,Shipment字段存在不同值,且Shipment date字段也存在不同值。
条件示例说明
Serial No.='01':分组内Shipment有Washington和Green Gala两种值,Shipment date有2020-01-01、NULL、2020-01-02三种值,同时满足两个字段的差异要求,保留该分组所有记录Serial No.='02':分组内Shipment虽有差异,但Shipment date全为2020-02-01,不满足日期差异要求,排除该分组
实现代码
通过分组统计唯一值数量,筛选符合条件的Serial No.后提取对应记录:
# 按Serial No.分组,统计每个分组内两个字段的唯一值数量 group_metrics = df.groupby('Serial No.').agg( has_diff_shipment=('Shipment', 'nunique'), has_diff_date=('Shipment date', 'nunique') ) # 筛选出两个字段都存在差异的Serial No. valid_serials = group_metrics[ (group_metrics['has_diff_shipment'] > 1) & (group_metrics['has_diff_date'] > 1) ].index # 提取符合条件的记录 filtered_df = df[df['Serial No.'].isin(valid_serials)]
最终结果
运行代码后得到的结果如下:
print(filtered_df) # 输出: # Shipment Source Serial No. Freight type Shipment date # 0 Washington USA 01 Truck 2020-01-01 # 1 Green Gala SA 01 Air NULL # 2 Green Gala NZ 01 Sea 2020-01-02
或者直接构造目标DataFrame的代码:
filtered_df = pd.DataFrame({ 'Shipment': ['Washington','Green Gala', 'Green Gala'], 'Source': ['USA', 'SA','NZ'], 'Serial No.': ['01','01','01'], 'Freight type': ['Truck','Air','Sea'], 'Shipment date': ['2020-01-01','NULL','2020-01-02'] })
内容的提问来源于stack exchange,提问作者yawwml
相关产品推荐
相关产品推荐

