如何使用Pandas筛选所有分组中均存在的日期数据行
Pandas筛选所有分组均存在的日期行
需求说明
需要筛选出所有分组(group)中均存在的日期对应的行。例如日期2022-09-03在A、B、C、D所有分组中都存在,而2022-09-01缺少B分组的数据,因此不应保留。
原始DataFrame
import pandas as pd data = [['A', '2022-09-01'], ['A', '2022-09-03'], ['A', '2022-09-07'], ['A', '2022-09-08'], ['B', '2022-09-03'], ['B', '2022-09-07'], ['B', '2022-09-08'], ['B', '2022-09-09'], ['C', '2022-09-01'], ['C', '2022-09-03'], ['C', '2022-09-07'], ['C', '2022-09-10'], ['D', '2022-09-01'], ['D', '2022-09-03'], ['D', '2022-09-05'], ['D', '2022-09-07']] df = pd.DataFrame(data = data, columns = ['group', 'date'])
原始数据输出:
group date 0 A 2022-09-01 1 A 2022-09-03 2 A 2022-09-07 3 A 2022-09-08 4 B 2022-09-03 5 B 2022-09-07 6 B 2022-09-08 7 B 2022-09-09 8 C 2022-09-01 9 C 2022-09-03 10 C 2022-09-07 11 C 2022-09-10 12 D 2022-09-01 13 D 2022-09-03 14 D 2022-09-05 15 D 2022-09-07
期望输出
data = [['A', '2022-09-03'], ['A', '2022-09-07'], ['B', '2022-09-03'], ['B', '2022-09-07'], ['C', '2022-09-03'], ['C', '2022-09-07'], ['D', '2022-09-03'], ['D', '2022-09-07']] df_desired = pd.DataFrame(data = data, columns = ['group', 'date'])
期望结果输出:
group date 0 A 2022-09-03 1 A 2022-09-07 2 B 2022-09-03 3 B 2022-09-07 4 C 2022-09-03 5 C 2022-09-07 6 D 2022-09-03 7 D 2022-09-07
解决方案
核心思路是先找出所有分组都覆盖的日期,再用这些日期过滤原数据。具体实现代码如下:
# 计算总共有多少个不同的分组 total_groups = df['group'].nunique() # 按日期分组,统计每个日期对应的分组数量,筛选出分组数等于总分组数的日期 valid_dates = df.groupby('date')['group'].nunique()[lambda x: x == total_groups].index # 用符合条件的日期过滤原DataFrame result = df[df['date'].isin(valid_dates)] # 重置索引并查看结果 print(result.reset_index(drop=True))
代码解释
df['group'].nunique():获取数据中所有不同分组的数量(此处为4个:A、B、C、D)groupby('date')['group'].nunique():按日期聚合,统计每个日期下出现的不同分组数lambda x: x == total_groups:筛选出分组数等于总分组数的日期,这些日期就是所有分组都存在的日期df['date'].isin(valid_dates):过滤原DataFrame,只保留日期在valid_dates中的行
运行上述代码后,输出结果与期望完全一致。
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

