如何筛选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
相关产品推荐
相关产品推荐

