繁体   English   中英

熊猫-基于条件的首次出现的下降行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM