Pandas多条件筛选:家庭调查数据合规受访者过滤
正确筛选符合条件的私营部门受访者数据
需求回顾
需要筛选满足以下条件的受访者:
- 有工作(
HASAJOB=1) - 至少拥有1份私营部门工作(
JOB1=2或JOB2=2) - 所有私营部门工作均已填报每日时长(若某份工作是私营,则对应
HOURS字段不能为999;非私营工作的时长填报情况不做要求)
原代码问题分析
你之前的代码存在两个核心问题:
- 引用了上游的
hasajob数据框而非当前的work_in_private_sector,导致索引匹配错误 - 使用了
|(或)逻辑,仅要求至少一份私营工作填报时长,但我们需要的是所有私营工作都填报时长
正确筛选逻辑与代码
我们可以通过反向逻辑实现:先找出「存在未填报时长的私营工作」的行,再排除这些行。
分步实现代码
# 导入模块 import pandas as pd # 初始化数据 survey = pd.DataFrame({'HASAJOB': [1, 1, 1, 1, 1, 1, 1, 0, 0, 0], 'JOB1': [1, 2, 2, 2, 1, 2, 2, None, None, None], 'HOURS1': [999, 8, 7, 999, 8, 6, 6, None, None, None], 'JOB2': [2, None, 2, None, None, 1, None, None, None, None], 'HOURS2': [4, None, 999, None, None, 999, None, None, None, None] }) # 第一步:筛选有工作的受访者 hasajob = survey[survey['HASAJOB'] == 1] # 第二步:筛选至少有一份私营工作的受访者 work_in_private_sector = hasajob[(hasajob['JOB1'] == 2) | (hasajob['JOB2'] == 2)] # 定义「私营工作未填报时长」的两个条件 cond1 = (work_in_private_sector['JOB1'] == 2) & (work_in_private_sector['HOURS1'] == 999) cond2 = (work_in_private_sector['JOB2'] == 2) & (work_in_private_sector['HOURS2'] == 999) # 排除存在以上任一情况的行,得到最终结果 final_filtered = work_in_private_sector[~(cond1 | cond2)]
最终输出结果
HASAJOB JOB1 HOURS1 JOB2 HOURS2 0 1 1.0 999.0 2.0 4.0 1 1 2.0 8.0 NaN NaN 5 1 2.0 6.0 1.0 999.0 6 1 2.0 6.0 NaN NaN
简洁版一步到位代码
如果想简化步骤,也可以直接合并所有筛选条件:
final_filtered = survey[ (survey['HASAJOB'] == 1) & ((survey['JOB1'] == 2) | (survey['JOB2'] == 2)) & ~( ((survey['JOB1'] == 2) & (survey['HOURS1'] == 999)) | ((survey['JOB2'] == 2) & (survey['HOURS2'] == 999)) ) ]
逻辑说明
cond1和cond2分别捕获「第一份工作是私营但未填报时长」「第二份工作是私营但未填报时长」的情况~(cond1 | cond2)表示排除掉存在以上任一问题的行,确保保留的所有行中,所有私营工作都已填报时长,非私营工作的时长状态不影响筛选结果
内容的提问来源于stack exchange,提问作者asanz
相关产品推荐
相关产品推荐

