我有一列(user_id)包含数千个 user_id(也重复),另一列(字符串)包含几个不同的字符串。我想检查唯一的 user_id 是否具有特定字符串并将用户 id 和 1 存储在新的数据框中。如果 user_id 没有字符串,那么我想存储 user_id 和 0。在这种情况下,我想为字符串“good”提供 1,为任何其他字符串提供 0。
我似乎无法找到一种不无限循环的好方法。
初始 Pandas 数据框
用户ID | 绳子 |
---|---|
1 | 好 |
1 | 更好 |
1 | 好 |
2 | 好 |
2 | 更糟 |
3 | 更糟 |
3 | 更糟 |
所需的 Pandas 数据框
用户ID | 是字符串 |
---|---|
1 | 1 |
2 | 1 |
3 | 0 |
为了保持其矢量化,我们可以跳过
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
您可以使用 issubset:
来验证字符串是否包含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)