python - pandas - 根据第一次出现的条件删除行

标签 python pandas

下面是一个更大的字典的示例

 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/

相关文章:

python - 根据来自不同数据框的两列条件乘以列?

python - 暂时禁用 auto_now/auto_now_add

python - 如何去除列表中的 unicode

python - 从 pandas DataFrame 转换为原始 numpy 数组可以提高 ML 性能吗?

python - 如何在 selenium for python 中转义 xpath 1.0 中的单引号

python - 如何在Python中将列中字符串的格式更改为3位数字 "000"

python - 在 Visual Studio Code 中调试 Scrapy 项目

python - 如何在系统文件夹的 Windows 资源管理器中按创建日期对子文件夹和文件的内容进行排序并进行更改(排序依据)?

python - 删除 pandas 中的一系列行

python - 仅重新排列 pandas 中的特定列