删除与我的数据集无关的行
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
考虑以下 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