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

如何筛选Pandas DataFrame并按条件生成3个新DataFrame?

Pandas DataFrame 多维度筛选实现

原始数据

name;id;value;source;date
john;id_123;33;A;2023-03-29
john;id_123;33;B;2023-03-29
peter;id_222;55;A;2023-03-30
peter;id_222;44;B;2023-03-30
mary;id_333;88;A;2023-30-30

1. 按ID+日期去重,优先保留Source=B的记录

需求:同一ID+日期存在多条记录时,仅保留source为B的条目;无B的则保留原记录。

实现代码:

import pandas as pd

# 读取分号分隔的CSV数据
df = pd.read_csv('your_data.csv', sep=';')

# 给source排序,让B优先级高于A,再按ID+日期去重留第一条
df_sorted = df.sort_values(by='source', key=lambda x: x.map({'B': 0, 'A': 1}))
df_result1 = df_sorted.drop_duplicates(subset=['id', 'date'], keep='first').sort_index()

处理后结果:

name;id;value;source;date
john;id_123;33;B;2023-03-29
peter;id_222;44;B;2023-03-30
mary;id_333;88;A;2023-30-30

2. 移除ID+值+日期重复组内的Source=A记录

需求:删除同一ID+value+date组中同时存在A和B时的A记录,保留其余所有条目。

实现代码:

# 生成需要删除的记录掩码
remove_mask = (
    df.duplicated(subset=['id', 'value', 'date'], keep=False)
    & (df['source'] == 'A')
    & df.groupby(['id', 'value', 'date'])['source'].transform(lambda g: 'B' in g.values)
)

df_result2 = df[~remove_mask]

处理后结果:

name;id;value;source;date
john;id_123;33;B;2023-03-29
peter;id_222;55;A;2023-03-30
peter;id_222;44;B;2023-03-30
mary;id_333;88;A;2023-30-30

3. 提取同一ID+日期下值不同的所有记录

需求:找出所有ID+日期组内value不唯一的条目,保留该组全部记录。

实现代码:

# 筛选出value不唯一的ID+日期组
target_groups = df.groupby(['id', 'date'])['value'].nunique() > 1
# 提取对应组的记录
df_result3 = df[df.set_index(['id', 'date']).index.isin(target_groups[target_groups].index)]

处理后结果:

name;id;value;source;date
peter;id_222;55;A;2023-03-30
peter;id_222;44;B;2023-03-30 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:13:17