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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:37:09