分组后如何检查一列是否包含特定元素?

时间:2018-09-24 13:57:19

标签: python pandas dataframe pandas-groupby

我要检查按列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

3 个答案:

答案 0 :(得分:4)

transformany

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

答案 1 :(得分: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]

然后通过isin测试user列的成员资格:

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 s和False s-0

答案 2 :(得分: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
相关问题