Pandas筛选数组中所有元素存在的行
首先,这个帖子标题可能没有很好地表达问题,所以我在这里表示歉意。
问题是这样的:
日期 | 类型 | 值 |
---|---|---|
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