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)
与组成布尔掩码,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)