如何按唯一值拆分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
相关产品推荐
相关产品推荐

