如何移除DataFrame中存在status_id=1的用户的所有行
嘿,这个需求很明确——要把所有曾经有过status_id=1记录的用户的行全部删掉,只留下从来没出现过status_id=1的用户的所有数据对吧?下面给你几种实用的Pandas实现方法,都能达成目标:
方法1:分组后标记过滤(直观的组级判断)
这种方法通过按用户唯一标识(这里是id)分组,判断每组内是否存在status_id=1的记录,再过滤掉包含该状态的用户所有行:
import pandas as pd # 构造你的原始DataFrame df = pd.DataFrame({ 'id': [23,23,23,25,25,28,29,29], 'name': ['Alex','Alex','Alex','Bill','Bill','Claire','David','David'], 'email': ['a@a.com','a@a.com','a@a.com','b@b.com','b@b.com','c@c.com','d@d.com','d@d.com'], 'status_id': [1,2,3,2,3,3,1,2] }) # 给每一行标记:所属用户是否从未有过status_id=1 has_no_status_1 = df.groupby('id')['status_id'].transform(lambda x: not x.isin([1]).any()) # 过滤得到结果 result_df = df[has_no_status_1] print(result_df)
结果输出:
id name email status_id 3 25 Bill b@b.com 2 4 25 Bill b@b.com 3 5 28 Claire c@c.com 3
方法2:先提取无效用户ID再过滤(逻辑更直白)
先找出所有出现过status_id=1的用户ID,再直接过滤掉这些用户的所有行,新手更容易理解:
# 获取所有存在status_id=1的用户ID invalid_user_ids = df[df['status_id'] == 1]['id'].unique() # 保留不在无效ID列表里的用户数据 result_df = df[~df['id'].isin(invalid_user_ids)]
方法3:用query简化写法(代码更紧凑)
如果偏爱简洁的语法,可以结合query方法实现,逻辑和方法2一致:
invalid_user_ids = df[df['status_id'] == 1]['id'].unique() result_df = df.query('id not in @invalid_user_ids')
这三种方法都能精准得到你想要的结果,其中方法2的性能在大数据量下会更优,因为它只需要一次筛选和去重,再做一次过滤即可。
内容的提问来源于stack exchange,提问作者Alexandre Lara
相关产品推荐
相关产品推荐

