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