You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame过滤失效:输出空数据集,单属性过滤也无效

Pandas DataFrame过滤返回空集的解决方法

问题根源

你的代码存在两个核心问题导致过滤失效:

  • 数据类型不匹配:mark_info中的age被强制转为字符串,但DataFrame中的age是数值类型(整数),字符串与数值的比较永远不成立。
  • 数据集加载格式问题:adult.data.csv的字段通常是逗号加空格分隔(比如30, Private, Bachelors, ...),默认的pd.read_csv会保留字段值前的空格,即便后续用str.strip()处理,也可能因加载时的格式异常导致匹配失败。

修复步骤

  1. 修正数据类型匹配
    不对age做字符串转换,保持其数值类型:

    # 仅对非数值字段做字符串转换
    for key in mark_info:
        if key != "age":
            mark_info[key] = str(mark_info[key]).strip()
    
  2. 正确加载数据集
    指定分隔符为逗号加任意空格,自动去除字段值前的空格:

    df = pd.read_csv(dataset_path, names=column_names, sep=',\s*', engine='python')
    
  3. 简化过滤条件写法
    用批量方式构建过滤条件,避免重复冗余代码:

    # 生成布尔索引
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:52:03