Pandas 每月和每天按每个ID的观察频率进行过滤-熊猫

Pandas 每月和每天按每个ID的观察频率进行过滤-熊猫,pandas,Pandas,我试图过滤我的数据帧[包括ID、日期、时间(这些是索引)和其他变量(不管是哪个)] 我想通过每个ID、每个月和每天的观察频率来过滤数据帧 这意味着,我想使用至少有10个OB的ID每一个月,和至少5个obs每天,并排除不符合条件的人员 数据说明: ID date time x y a 07/27/2019 .. .. .. .. .. .. .. .. .. 08/27/2019 ..

我试图过滤我的数据帧[包括ID、日期、时间(这些是索引)和其他变量(不管是哪个)]

我想通过每个ID、每个月和每天的观察频率来过滤数据帧

这意味着,我想使用至少有10个OB的ID一个月,至少5个obs每天,并排除不符合条件的人员

数据说明:

ID  date        time x  y
a   07/27/2019  ..  ..  ..
                ..  ..  ..
                ..  ..  ..
    08/27/2019  ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
b   06/28/2019  ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
    07/30/2019  ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
                ..  ..  ..
您可以与计数依据、比较依据和筛选依据一起使用:


@qwerty-如果测试
print(m)
print(d)
返回实际数据中的预期输出?每个月应至少有10次观察,而不是总共10次观察。此外,每天至少观察5次,而不是总共观察5次。如果我打印M和D,它会显示每个ID总共有多少个观察值。@qwerty-你能用预期的输出更改样本中的数据吗?我已经编辑了数据。为了简单起见,现在的条件是:每个ID每月必须至少有5次观察。因此,在过滤了上面的数据之后,我们将只使用ID“b”,因为ID“a”在7月份至少没有5个观察值。@qwerty-您现在可以测试吗?
df['date'] = pd.to_datetime(df['date'])
m = df.groupby(['ID', pd.Grouper(freq='M', key='date')])['date'].transform('size')
d = df.groupby(['ID','date'])['date'].transform('size')

print (df.assign(m = m, d = d))
   ID       date   time   x   y  m  d
0   a 2019-07-27  18:00  ..  ..  3  3
1   a 2019-07-27  18:00  ..  ..  3  3
2   a 2019-07-27  19:00  ..  ..  3  3
3   a 2019-08-27  20:00  ..  ..  6  6
4   a 2019-08-27  20:00  ..  ..  6  6
5   a 2019-08-27  20:00  ..  ..  6  6
6   a 2019-08-27  20:00  ..  ..  6  6
7   a 2019-08-27  20:00  ..  ..  6  6
8   a 2019-08-27  21:00  ..  ..  6  6
9   b 2019-06-28  18:00  ..  ..  6  6
10  b 2019-06-28  18:00  ..  ..  6  6
11  b 2019-06-28  18:00  ..  ..  6  6
12  b 2019-06-28  18:00  ..  ..  6  6
13  b 2019-06-28  18:00  ..  ..  6  6
14  b 2019-06-28  19:00  ..  ..  6  6
15  b 2019-07-30  08:00  ..  ..  8  8
16  b 2019-07-30  08:00  ..  ..  8  8
17  b 2019-07-30  08:00  ..  ..  8  8
18  b 2019-07-30  08:00  ..  ..  8  8
19  b 2019-07-30  08:00  ..  ..  8  8
20  b 2019-07-30  08:00  ..  ..  8  8
21  b 2019-07-30  09:00  ..  ..  8  8
22  b 2019-07-30  10:00  ..  ..  8  8

df = df[(m > 10) & (d > 5)]

print (df)