[英]pandas - drop row based on first occurrence of condition
下面是一个更大的字典的示例
data ={'StudentId':['AAdams','AAdams','AAdams','AAdams','AAdams','AAdams',
'BBrooks','BBrooks','BBrooks','BBrooks','BBrooks',],
'year':[2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016],
'month':[11,11,11,11,12,12,12,12,12,1,1],
'day':[15,16,21,23,1,2,15,18,30,5,7],
'BookLevel':[1.5,1.5,1.2,1.4,1.7,1.8,3.2,3.1,3.8,3.3,3.4]}
我想从每个学生的第一个月开始删除最大值的第一次出现。 如果有第二次发生,我想保留该次发生
我使用了按StudentId,年和月分组的groupby,并计算了BookLevel的最大值。
然后,我做了另一个数据框来计算每个学生每月的最大值,并将两个数据框合并
然后,我得到了一个数据框,如下所示:
StudentId year month BookLevel BookLevelMax
0 AAdams 2015 11 1.5 1.5
1 AAdams 2015 11 1.5 1.5
2 AAdams 2015 11 1.2 1.5
3 AAdams 2015 11 1.4 1.5
4 AAdams 2015 12 1.7 1.8
5 AAdams 2015 12 1.8 1.8
6 BBrooks 2015 12 3.2 3.8
7 BBrooks 2015 12 3.1 3.8
8 BBrooks 2015 12 3.8 3.8
9 BBrooks 2016 1 3.3 3.4
10 BBrooks 2016 1 3.4 3.4
我想在第11个月中删除AAdams在第11个月中第一次出现的1.5并在第12个月中删除BBrooks在3.8行中的第一次出现
我可以使用df.drop删除BookLevel Max等于BookLevel ...的行...但是它将删除每个学生每个月的最大值,并删除第一次出现的行和第二次出现的行(如果有两个行)。
StudentId year month BookLevel BookLevelMax
2 AAdams 2015 11 1.2 1.5
3 AAdams 2015 11 1.4 1.5
4 AAdams 2015 12 1.7 1.8
6 BBrooks 2015 12 3.2 3.8
7 BBrooks 2015 12 3.1 3.8
9 BBrooks 2016 1 3.3 3.4
我似乎找不到找到只删除第一次出现并只在第一个月内删除的方法。 具体来说,AAdams在第11个月的最大值为1.5。它有两种情况。 我想保留其中一个行,而将其他行留掉……。我想将该行保持在AAdams下1.8,因为它发生在第二个月(其他事件发生在第一个月之后的几个月)。 希望这是有道理的。
尝试这个
# sort and reindex
df = df.sort('col').reset_index()
#slice to first occurrence of your value
df.loc[: df[(df['col'] == 'row')].index[0], :]
原始问题(如上所述):
以下是变成dfdata的较大词典的示例
data ={'StudentId':['AAdams','AAdams','AAdams','AAdams','AAdams','AAdams',
'BBrooks','BBrooks','BBrooks','BBrooks','BBrooks',],
'year':[2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016],
'month':[11,11,11,11,12,12,12,12,12,1,1],
'day':[15,16,21,23,1,2,15,18,30,5,7],
'BookLevel':[1.5,1.5,1.2,1.4,1.7,1.8,3.2,3.1,3.8,3.3,3.4]}
我想从每个学生的第一个月开始删除最大值的第一次出现。 如果第二次发生,我想保留该次。 除了每个月的第一个月,我都不想更改任何其他月份
这是我的新解决方案:
df =dfdata.sort_values(by=['StudentId','year','month','BookLevel'],ascending = [True,True,True,False])
这将第一个月的最高BookLevel带到每个学生ID组(年,月)的顶部。
然后我用cumcount做了一个groupby。 在第一个月中,这在每个学生的最高书本旁边放置一个零。
df1 = (df.groupby('StudentId').cumcount())
然后我通过选择所有不带零的行来进行分组
df2 = df(df.groupby('StudentId').cumcount() !=0])
任务完成! 最初的尝试是一个很好的例子,它着眼于渐进的进步,但却忽视了最初的目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.