选择Dataframe groupby,然后根据菜单或文本选项进行筛选

2024-09-28 03:22:25 发布

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

我的数据框如下所示,我的目的是pandas.groupby在学生的名字上,找出他们在“英语”和“印地语”之间做了什么活动

 data ={'StudentId':['AAdams','AAdams','AAdams','AAdams','AAdams','AAdams',
                'BBrooks','BBrooks','BBrooks','BBrooks','BBrooks',],

'activity':['came school','english','lunch','hindi','sports','left school','came school','english','read','hindi','left school'],
'month':[11,11,11,11,12,12,12,12,12,1,1]}

pd.DataFrame(data)

StudentId   activity    month
0   AAdams  came school 11
1   AAdams  english 11
2   AAdams  lunch   11
3   AAdams  hindi   11
4   AAdams  sports  12
5   AAdams  left school 12
6   BBrooks came school 12
7   BBrooks english 12
8   BBrooks read    12
9   BBrooks hindi   1
10  BBrooks left school 1

到目前为止我试过的或者我知道的是

df[df.b.eq('english').groupby(df.StudentId).cumsum()].reset_index(drop=True)

or 

df.groupby('StudentId').apply(lambda x: x.loc[(x.b == 'english').idxmax():,:])
                .reset_index(drop=True)

然后削减我的数据帧,然后我可以做下面的代码

df.groupby('StudentId').head(5)

最终的数据帧或输出应该看起来像activity=english和activity=hindi之间的活动

    StudentId   activity    month
1   AAdams  english 11
2   AAdams  lunch   11
3   AAdams  hindi   11
7   BBrooks english 12
8   BBrooks read    12
9   BBrooks hindi   1

Tags: 数据dfreadenglishactivityleftgroupbylunch
1条回答
网友
1楼 · 发布于 2024-09-28 03:22:25

如果每个组的第一个值是english,第二个值是hindi,则为解决方案。你知道吗

通过^{}为第一个和第二个需要创建布尔掩码,通过[::-1]索引从后面排序,通过&创建最后一个链掩码,并通过^{}过滤:

m1 = df['activity'].eq('english').astype(int).groupby(df['StudentId']).cumsum().gt(0)
m2 = df['activity'].eq('hindi').astype(int).iloc[::-1].groupby(df['StudentId']).cumsum().gt(0)

df = df[m1 & m2]
print (df)
  StudentId activity  month
1    AAdams  english     11
2    AAdams    lunch     11
3    AAdams    hindi     11
7   BBrooks  english     12
8   BBrooks     read     12
9   BBrooks    hindi      1

相关问题 更多 >

    热门问题