下面是一个更大的字典的示例
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 并计算出最大值 图书级别。
然后,我创建了另一个数据框来计算每个学生每月的最大值,并将两个数据框合并起来
然后我有一个如下所示的数据框:
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
我想删除 AAdams 在第 11 个月首次出现的 1.5 行以及 BBrooks 在第 12 个月首次出现的 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 的行,因为它发生在第二个月(以及其他学生在第一个月后的几个月内发生的其他情况)。希望这是有道理的。
最佳答案
原始问题(如上所述):
下面是一个更大的字典的示例,它成为 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 位于每组 StudentID、年份、月份的顶部。
然后我使用 cumcount 进行了分组。这会在第一个月每个学生的最高图书水平旁边放置一个零。
df1 = (df.groupby('StudentId').cumcount())
然后我通过选择所有不带零的行进行了分组
df2 = df(df.groupby('StudentId').cumcount() !=0])
任务完成! 最初的尝试是一个很好的例子,它着眼于渐进的进展,但却忽视了最初的目标。
关于python - pandas - 根据第一次出现的条件删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38014984/