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

如何基于列值从按Days和ID分组的DataFrame中删除行?

按Days和ID分组删除DataFrame中符合条件的行

需求说明

对DataFrame按Days和ID两列分组后,每组内删除同时满足以下三个条件的行:

  • Car3的值为nan
  • 当前行的Car1等于组内另一行的Car2
  • 当前行的Car2等于组内另一行的Car3

示例DataFrame

import pandas as pd
import numpy as np

df = pd.DataFrame({'Days':[5,5,5,5,6,6],
                   'ID':['A11','A11','A11','A11','B12','B12'],
                   'Country':['DE','DE','FR','US','US','US'],
                   'Car1':['BMW','Volvo','Audi','BMW','Mercedes','BMW'],
                   'Car2':['Volvo','Mercedes','BMW','Volvo','Volvo','Volvo'],
                   'Car3':['Mercedes',np.nan,'Volvo',np.nan,np.nan,np.nan]})

对应表格:

DaysIDCountryCar1Car2Car3
05A11DEBMWVolvoMercedes
15A11DEVolvoMercedesNaN
25A11FRAudiBMWVolvo
35A11USBMWVolvoNaN
46B12USMercedesVolvoNaN
56B12USBMWVolvoNaN

解决方案代码

def filter_group(group):
    # 提取组内非空的Car2、Car3值集合,用于快速匹配判断
    group_car2 = set(group['Car2'].dropna())
    group_car3 = set(group['Car3'].dropna())
    
    # 构建保留行的掩码:不满足三个删除条件的行
    mask = ~(
        (group['Car3'].isna()) &
        (group['Car1'].isin(group_car2)) &
        (group['Car2'].isin(group_car3))
    )
    return group[mask]

# 按Days和ID分组应用过滤逻辑
filtered_df = df.groupby(['Days', 'ID'], group_keys=False).apply(filter_group)

处理后结果

执行以下代码查看结果:

print(filtered_df.reset_index(drop=True))

输出表格:

DaysIDCountryCar1Car2Car3
05A11DEBMWVolvoMercedes
15A11FRAudiBMWVolvo
26B12USMercedesVolvoNaN
36B12USBMWVolvoNaN

代码说明

  1. 分组过滤函数filter_group:
    • 先收集组内所有非空的Car2和Car3值,用集合存储提升匹配效率
    • 通过掩码反向筛选,排除同时满足三个删除条件的行
  2. 利用groupby按指定列分组,将过滤函数应用到每个分组,最终得到目标DataFrame

内容的提问来源于stack exchange,提问作者the phoenix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:45:30