Pandas DataFrame过滤失效:输出空数据集,单属性过滤也无效
Pandas DataFrame过滤返回空集的解决方法
问题根源
你的代码存在两个核心问题导致过滤失效:
- 数据类型不匹配:
mark_info中的age被强制转为字符串,但DataFrame中的age是数值类型(整数),字符串与数值的比较永远不成立。 - 数据集加载格式问题:
adult.data.csv的字段通常是逗号加空格分隔(比如30, Private, Bachelors, ...),默认的pd.read_csv会保留字段值前的空格,即便后续用str.strip()处理,也可能因加载时的格式异常导致匹配失败。
修复步骤
修正数据类型匹配
不对age做字符串转换,保持其数值类型:# 仅对非数值字段做字符串转换 for key in mark_info: if key != "age": mark_info[key] = str(mark_info[key]).strip()正确加载数据集
指定分隔符为逗号加任意空格,自动去除字段值前的空格:df = pd.read_csv(dataset_path, names=column_names, sep=',\s*', engine='python')简化过滤条件写法
用批量方式构建过滤条件,避免重复冗余代码:# 生成布尔索引 mask = pd.Series([True]*len(df), index=df.index) for col, val in mark_info.items(): mask &= df[col] == val # 过滤数据 matching_rows = df[mask]
完整修复后的代码
import pandas as pd # Load the dataset dataset_path = "G:\\assignment\\adult.data.csv" column_names = ["age", "workclass", "education", "occupation", "race", "sex", "salary"] # 处理逗号加空格的分隔符 df = pd.read_csv(dataset_path, names=column_names, sep=',\s*', engine='python') # Background knowledge about Mark mark_info = { "age":30, "workclass": "Private", "education": "Bachelors", "occupation": "Adm-clerical", "race": "White", "sex": "Male", "salary": "<=50K" } # 仅对非数值字段做字符串转换 for key in mark_info: if key != "age": mark_info[key] = str(mark_info[key]).strip() # 构建过滤条件并筛选 mask = pd.Series([True]*len(df), index=df.index) for col, val in mark_info.items(): mask &= df[col] == val matching_rows = df[mask] print(matching_rows)
内容的提问来源于stack exchange,提问作者Tahir
相关产品推荐
相关产品推荐

