Pandas筛选数组中所有元素存在的行

1 投票
1 回答
40 浏览
提问于 2025-04-14 16:51

首先,这个帖子标题可能没有很好地表达问题,所以我在这里表示歉意。

问题是这样的:

日期 类型
2024-03-11 3 3
2024-3-11 4 5
2024-03-12 3 3
2024-3-12 4 5
2024-3-12 5 5
2024-03-13 3 3
2024-3-13 4 5
2024-3-13 5 2
2024-3-14 5 5

类型 = [3,4,5]

我想知道在Pandas中,有没有简单的方法可以从上面的数据框(DF)中创建一个新的数据框,条件是日期的值必须包含列表中的所有元素?

也就是说,结果的数据框应该只包含日期12和13的数据,因为原始数据框在类型数组中的元素都有值。

谢谢!

1 个回答

3

使用一个set,通过groupby.agg来聚合数据,然后用issubset来检查子集,最后用isin布尔索引来过滤数据:

Type = {3,4,5}

df['Date'] = pd.to_datetime(df['Date'])

keep = df.groupby('Date')['Type'].agg(Type.issubset)

out = df[df['Date'].isin(keep.index[keep])]

还有一种用groupby.transform的方法:

Type = {3,4,5}

df['Date'] = pd.to_datetime(df['Date'])

out = df[df.groupby('Date')['Type'].transform(Type.issubset)]

输出结果:

        Date  Type  Value
2 2024-03-12     3      3
3 2024-03-12     4      5
4 2024-03-12     5      5
5 2024-03-13     3      3
6 2024-03-13     4      5
7 2024-03-13     5      2

中间结果:

# keep
Date
2024-03-11    False
2024-03-12     True
2024-03-13     True
2024-03-14    False
Name: Type, dtype: bool

# df['Date'].isin(keep.index[keep])
# or
# df.groupby('Date')['Type'].transform(Type.issubset)
0    False
1    False
2     True
3     True
4     True
5     True
6     True
7     True
8    False
Name: Type, dtype: bool

撰写回答