Как проверить, содержит ли столбец определенный элемент после группировки по?

1

Я хочу проверить, содержит ли группа app столбца user столбца определенный элемент, например b.

import pandas as pd 
df=pd.DataFrame({'user':[1,1,1,2,2,3,3],'app':['a','b','c','a','c','b','c']})

Input:

   app  user
0   a     1
1   b     1
2   c     1
3   a     2
4   c     2
5   b     3
6   c     3

Expected:

   app  user  contains_b
0   a     1           1
1   b     1           1
2   c     1           1
3   a     2           0
4   c     2           0
5   b     3           1
6   c     3           1
Теги:
pandas
dataframe
pandas-groupby

3 ответа

3
Лучший ответ

Использование:

df['contains_b'] = df['user'].isin(df.loc[df['app'].eq('b'), 'user'].unique()).astype(int)
print (df)

   user app  contains_b
0     1   a           1
1     1   b           1
2     1   c           1
3     2   a           0
4     2   c           0
5     3   b           1
6     3   c           1

Детали:

Первый фильтр с помощью eq (==) app столбца и получить все строки пользователя:

print (df.loc[df['app'].eq('b'), 'user'])
1    1
5    3
Name: user, dtype: int64

Для лучшей производительности используйте unique:

print (df.loc[df['app'].eq('b'), 'user'].unique())
[1 3]

Затем проверьте user столбец для членства по isin:

print (df['user'].isin(df.loc[df['app'].eq('b'), 'user'].unique()))
0     True
1     True
2     True
3    False
4    False
5     True
6     True
Name: user, dtype: bool

И последнее приведение к целому числу True равно 1 и False - 0.

4

transform с помощью any

df.assign(contains_b=df.app.eq('b').groupby(df.user).transform('any').astype(int))

  app  user  contains_b
0   a     1           1
1   b     1           1
2   c     1           1
3   a     2           0
4   c     2           0
5   b     3           1
6   c     3           1
2

Использование isin

df['contains_b'] = df.groupby('user').app.transform(lambda x: x.isin(['b']).any()).astype(int)

    user app contains_b
0   1    a   1
1   1    b   1
2   1    c   1
3   2    a   0
4   2    c   0
5   3    b   1
6   3    c   1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню