大Pandas根据第一次出现的情况进行划船

2024-09-28 03:21:34 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一本大字典的样本

 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]}

我想删除每个学生第一个月的最大值。如果有第二次出现,我想保留它

我使用了groupby by StudentId、year和month并计算了 图书级别。在

然后我做了另一个数据帧来计算每个学生每月的最大值,并合并了两个数据帧

然后我得到了一个如下所示的数据帧:

^{pr2}$

我想去掉AAdams在第11个月出现的第一个1.5行,而BBrooks在第12个月的第3.8行

我可以用测向下降删除BookLevel Max等于BookLevel的行…但是它会在每个月为每个学生删除Max并删除 第一次和第二次,如果有两次。在

       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。它发生在两种情况下。我想保留其中一行,但不保留另一行……我希望将行数保持在1.8以下,因为它发生在第二个月(以及其他学生在第一个月之后的几个月出现的情况)。希望这有道理。在


Tags: 数据data情况year学生max样本groupby
2条回答

原问题(如上所述):

下面是一个成为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]}

我想删除每个学生第一个月的最大值。如果有第二次出现,我想保留它。除了每个学生的第一个月,我不想改变任何月份

这是我的新解决方案:

^{pr2}$

这使得第一个月的最高图书水平达到了每组学生的最高水平。在

然后我用cumcount做了一个分组。在每个学生第一个月的最高图书级别旁边,都会有一个零。在

^{3}$

然后我选择所有没有零的行进行分组

df2 = df(df.groupby('StudentId').cumcount() !=0])

任务完成了! 原始尝试是一个很好的例子,它可以看到渐进式的进展,但却忽略了最初的目标。在

试试这个

# sort and reindex
df = df.sort('col').reset_index()

#slice to first occurrence of your value
df.loc[: df[(df['col'] == 'row')].index[0], :]

相关问题 更多 >

    热门问题