Pandas按user_id分组处理DataFrame:按status规则过滤并去重
解决方案
可以通过分组标记+筛选+去重的步骤实现需求,具体代码如下:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'user_id': [1, 1, 1, 2, 2], 'alert_source': ['research'] * 5, 'status': ['deleted', 'deleted', 'valid', 'deleted', 'valid'] }) # 统一status字段大小写,避免匹配误差 df['status'] = df['status'].str.upper() # 为每行标记所属user_id是否存在VALID状态的记录 has_valid = df.groupby('user_id')['status'].transform(lambda x: (x == 'VALID').any()) # 筛选符合条件的行:要么是VALID行,要么是无VALID记录的DELETED行 filtered_df = df[(df['status'] == 'VALID') | (~has_valid & (df['status'] == 'DELETED'))] # 对全DELETED的user_id去重,仅保留一行 cleaned_df = filtered_df.drop_duplicates(subset=['user_id', 'status'], keep='first') print(cleaned_df)
代码说明:
- 统一大小写:将
status字段转为大写,避免原始数据中大小写不一致(如valid/VALID)导致的匹配失败。 - 分组标记:使用
groupby+transform为每行生成一个标记,指示该user_id是否存在VALID记录,高效完成每行的条件判断。 - 筛选逻辑:一步完成两种场景的初步过滤——直接保留
VALID行,或保留无VALID记录的DELETED行。 - 去重处理:对仅含
DELETED记录的user_id,通过drop_duplicates保留唯一行,满足去重需求。
如果数据中alert_source存在不同取值,可调整drop_duplicates的subset参数,比如加入alert_source,实现按user_id+alert_source+status维度去重。
内容的提问来源于stack exchange,提问作者Jaxsss
相关产品推荐
相关产品推荐

