删除与我的数据集无关的行

Remove rows that are not relevant for my data set

考虑以下 pandas 数据框,其中包含有关单个用户使用 public 池的信息。

他每周只能使用该服务两次,所以当他达到2次使用时,同一周内的其余天数自动为0。如何删除这些不相关的行,即所有满足的行df['Attended']==0 因为已经达到阈值?

Week Day Attended?
1     1      0
1     2      1
1     3      1
1     4      0
1     5      0
2     1      1
2     2      1
2     3      0
2     4      0
2     5      0
3     1      0
3     2      0
3     3      0
3     4      0
3     5      1

例如,预期输出将删除第 1 周的第 4,5 天,因为第 3 天达到阈值。以同样的方式,第 2 周的第 2 天达​​到阈值,因此第 3,4 天和5个被删除。

Week Day Attended?
1     1      0
1     2      1
1     3      1
2     1      1
2     2      1
3     1      0
3     2      0
3     3      0
3     4      0
3     5      1

cumsum 形成一个布尔掩码,以找到前 2 次出席后的 0.loc

的子集
m = df.groupby('Week')['Attended?'].cumsum().ge(2) & df['Attended?'].eq(0)
df.loc[~m]

    Week  Day  Attended?
0      1    1          0
1      1    2          1
2      1    3          1
5      2    1          1
6      2    2          1
10     3    1          0
11     3    2          0
12     3    3          0
13     3    4          0
14     3    5          1

要每周使用可变阈值来执行此操作,如您的评论所述,我们 map 然后可以使用相同的逻辑,检查创建的列,而不是标量值。

thresh = [1, 2, 2]  # Usages per week to drop after
week = [1, 2, 3]

df['threshold'] = df['Week'].map(dict(zip(week, thresh)))

m = df.groupby('Week')['Attended?'].cumsum().ge(df['threshold']) & df['Attended?'].eq(0)
df.loc[~m]

    Week  Day  Attended?  threshold
0      1    1          0          1
1      1    2          1          1
2      1    3          1          1
5      2    1          1          2
6      2    2          1          2
10     3    1          0          2
11     3    2          0          2
12     3    3          0          2
13     3    4          0          2
14     3    5          1          2