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

如何按唯一值拆分pandas dataframe及解决ID3算法实现的类型错误

修正数据集导入逻辑

当前类型报错的核心根源是read_csv的header=None参数使用错误,导致CSV第一行的表头被识别为普通样本数据,字符串类型的表头值混入数值列,使列数据类型变为混合object类型,才会触发字符串与整数的比较错误。
如果CSV本身第一行就是表头,直接去掉header=None参数即可,pandas会自动读取第一行作为列名:

import pandas as pd
training_set = pd.read_csv("训练集文件路径.csv")
test_set = pd.read_csv("测试集文件路径.csv")

如果CSV本身没有表头,需要手动指定列名,避免列名默认显示为数字:

# 按实际属性数量自定义列名
col_names = ["属性1", "属性2", "属性3", "标签"]
training_set = pd.read_csv("训练集文件路径.csv", header=None, names=col_names)

导入完成后可执行training_set.dtypes校验各列数据类型,确保数值列对应int/float类型,避免混合object类型。

按唯一值拆分DataFrame的正确实现

ID3算法默认处理离散属性,直接按属性唯一值匹配筛选即可,无需做大小比较:

columnName = "待拆分的属性列名"
# 获取当前列所有唯一值
unique_vals = training_set[columnName].unique()
sub_datasets = []
for val in unique_vals:
    # 筛选属性值等于当前唯一值的所有行,生成子数据集
    sub_df = training_set[training_set[columnName] == val].copy()
    # 可选:拆分后删除已使用的当前属性列,适配ID3递归逻辑
    sub_df = sub_df.drop(columns=[columnName])
    sub_datasets.append(sub_df)

连续属性拆分适配

如果是需要离散化的连续数值属性,提前将列转为数值类型后再做比较即可:

# 强制转换列为数值类型,非数值内容转为空值方便排查
training_set[columnName] = pd.to_numeric(training_set[columnName], errors='coerce')
# k为你计算得到的最优分割阈值
subset_ge = training_set[training_set[columnName] >= k].copy()
subset_lt = training_set[training_set[columnName] < k].copy()

异常排查

如果仍出现类型错误,执行以下代码检查列中混入的异常字符串:

invalid_rows = training_set[pd.to_numeric(training_set[columnName], errors='coerce').isna()]
print(invalid_rows[columnName])

如果输出内容为你原本的表头值,说明导入逻辑仍有问题,重新调整read_csv参数即可。

内容的提问来源于stack exchange,提问作者Evan Gertis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:54:03