我有一列(user_id(有数千个user_id(也重复(,还有一列(string(有几个不同的字符串。我想检查一个唯一的user_id是否有一个特定的字符串,并将用户id和1存储在一个新的数据帧中。如果user_id没有字符串,那么我想存储user_id和0。在这种情况下,我想给字符串"good"加1,给任何其他字符串加0。
如果不无休止地循环,我似乎找不到一个好的方法。
初始PANDAS数据帧
user_id | 字符串 |
---|---|
1 | 良好 |
1 | 更好 |
1 | 良好 |
2 | 良好 |
2 | 更糟 |
3 | 更糟 |
3 | 甚至更糟 |
为了保持矢量化,我们可以跳过apply
:
df['string'].eq('good').groupby(df['user_id']).any().astype(int).reset_index(name='is string')
user_id is string
0 1 1
1 2 1
2 3 0
您可以使用issobset:验证字符串是否包含
res = df.groupby('user_id')['string'].apply(frozenset(['good']).issubset).reset_index()
print(res)
输出
user_id string
0 1 True
1 2 True
2 3 False
如果需要作为整数:
res['string'] = res['string'].astype(int)
print(res)
输出
user_id string
0 1 1
1 2 1
2 3 0
作为替代方案:
res = df.groupby('user_id')['string'].apply(lambda x: x.eq('good').any()).reset_index()
res['string'] = res['string'].astype(int)
print(res)