Pandas Dataframe группирует, а затем фильтрует на основе меню или текстовой опции - PullRequest
0 голосов
/ 30 января 2019

мой фрейм данных выглядит так, как показано ниже, и я намерен 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)

окончательный фрейм данных или вывод должен выглядеть только действия междуактивность = английский и активность = хинди

    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

1 Ответ

0 голосов
/ 30 января 2019

Решение, если первое значение для групп равно english, а второе hindi.

. Создайте логические маски с помощью DataFrameGroupBy.cumsum для первого и второго порядка, заданного с помощью индексации с помощью[::-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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...