gpt4 book ai didi

python - Pandas Dataframe groupby,然后根据菜单或文本选项进行过滤

转载 作者:行者123 更新时间:2023-12-01 01:15:01 25 4
gpt4 key购买 nike

我的数据框如下所示,我的目的是对学生姓名进行 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

最佳答案

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

通过 DataFrameGroupBy.cumsum 创建 bool 掩码对于第一个和第二个,需要通过使用 [::-1] 进行索引从后开始排序,最后一个链掩码通过 & 进行排序,并通过 boolean indexing 进行过滤。 :

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

关于python - Pandas Dataframe groupby,然后根据菜单或文本选项进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54434778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com