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

Jos*_*Jos 0 delete-row dataframe pandas

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

他每周只能使用两次该服务,因此当他达到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
Run Code Online (Sandbox Code Playgroud)

例如,当在第3天达到阈值时,预期输出将从第1周删除第4,5天。以相同的方式,在第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
Run Code Online (Sandbox Code Playgroud)

ALo*_*llz 6

与组成布尔掩码,cumsum以找到0前2个出勤后的。子集.loc

m = df.groupby('Week')['Attended?'].cumsum().ge(2) & df['Attended?'].eq(0)
df.loc[~m]
Run Code Online (Sandbox Code Playgroud)
    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
Run Code Online (Sandbox Code Playgroud)

为此,如您的评论所述,每周使用可变的阈值,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
Run Code Online (Sandbox Code Playgroud)