使用Pandas依据两列值统计符合条件的行数问题
解决你的DataFrame筛选统计问题
看起来你遇到了字符串匹配和数据筛选的典型坑,我来帮你一步步排查解决:
1. 先修正筛选逻辑的核心问题
首先,你需要明确是包含匹配而非精确匹配,同时要忽略大小写。如果之前用了精确相等(==)来匹配CBO列的"motorista",那肯定会出错——因为你要的是包含这个词的行,而不是完全等于它的行。
正确的写法应该用str.contains,并设置case=False忽略大小写,同时用na=False排除空值行避免干扰:
# 正确的筛选统计代码 filtered_rows = dem[ dem['CBO'].str.contains('motorista', case=False, na=False) & (dem['ESCOLARIDADE'] == 'Fundamental completo') ] count = filtered_rows.shape[0] print(count)
2. 排查数据里的隐藏异常
如果上面的代码还是返回0,大概率是数据里有隐藏的空格、特殊字符或者拼写差异:
- 先清理ESCOLARIDADE列的前后空格,很多时候数据会带多余空格导致匹配失败:
filtered_rows = dem[ dem['CBO'].str.contains('motorista', case=False, na=False) & (dem['ESCOLARIDADE'].str.strip() == 'Fundamental completo') ] - 手动核对所有CBO含"motorista"的行,看看ESCOLARIDADE的实际值:
这样你就能直接看到哪一行的ESCOLARIDADE符合条件,也能快速发现比如拼写错误、全角字符这类隐藏问题。# 先导出所有CBO匹配的行,直观检查 motorista_records = dem[dem['CBO'].str.contains('motorista', case=False, na=False)] print(motorista_records[['CBO', 'ESCOLARIDADE']])
3. 解决另一个DataFrame的反向问题
对于那个本该返回0却得到1的DataFrame,用同样的思路排查:
- 打印出筛选出来的那一行,仔细检查CBO是否真的包含"motorista",ESCOLARIDADE是否真的符合条件
- 检查是否有空值被误判,或者字符串匹配时的大小写、空格问题
4. 快速验证数据的小技巧
可以用value_counts()查看列的唯一值,确认你的目标值确实存在于数据中:
# 查看ESCOLARIDADE的所有唯一值,确认目标值存在 print(dem['ESCOLARIDADE'].value_counts()) # 查看CBO列中包含motorista的所有唯一值 print(dem[dem['CBO'].str.contains('motorista', case=False, na=False)]['CBO'].value_counts())
按照这些步骤一步步来,应该就能找到问题所在并解决啦!
内容的提问来源于stack exchange,提问作者aabujamra
相关产品推荐
相关产品推荐

