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