DataFrame列分箱报错KeyError:Float64Index不在列中问题排查
DataFrame数值列分箱报错问题解决
问题背景
我编写了一个对DataFrame数值列进行分箱的函数,用于将列值划分为指定数量的类别,代码如下:
def binning_fun(df, col_name, num_of_bins): lt=[] for i in range(0,num_of_bins): lt.append(i) df[col_name]=pd.cut(df[col_name],bins=i+1, labels=lt) return df df="C:/Users/shootings.csv" binning_fun(df, df['depth'], 4)
调用该函数时出现如下错误:
"None of [Float64Index([61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, 59.4,
...
60.5, 59.8, 60.5, 61.2, 62.7, 60.8, 63.1, 62.8, 61.0, 62.2],
dtype='float64', length=53940)] are in the [columns]"
数据集示例:
carat cut clarity depth table 0 0.23 Ideal SI2 61.5 55.0 1 0.21 Premium SI1 59.8 61.0 2 0.23 Good VS1 56.9 65.0 3 0.29 Premium VS2 62.4 58.0 4 0.31 Good SI2 63.3 58.0 5 0.24 Good VVS2 90.7 62.8
预期输出:
depth 1 0 0 1 1 2
错误原因
- 参数传递错误:函数的
col_name参数需要接收列名字符串(如'depth'),但你传入的是df['depth']——这是一列数据,函数执行df[col_name]时,会把整列数值当成列名去查找,自然找不到对应列,触发报错。 - 未读取数据集:你把文件路径字符串直接赋值给
df,没有用pd.read_csv()将其转为DataFrame对象,导致函数无法对其进行列操作。 - 分箱逻辑冗余:循环会重复覆盖目标列,每次用
i+1个分箱,最终只会保留num_of_bins个分箱的结果,完全不需要循环,一次分箱即可完成需求。
修正后的代码
import pandas as pd def binning_fun(df, col_name, num_of_bins): # 生成对应数量的标签 labels = list(range(num_of_bins)) # 一次性完成分箱并赋值 df[col_name] = pd.cut(df[col_name], bins=num_of_bins, labels=labels) return df # 先读取数据集为DataFrame df = pd.read_csv("C:/Users/shootings.csv") # 传入列名字符串调用函数 df = binning_fun(df, 'depth', 4) # 查看分箱后的depth列 print(df['depth'])
测试结果
用示例数据运行后,depth列输出与预期一致:
0 1 1 0 2 0 3 1 4 1 5 2 Name: depth, dtype: category Categories (4, int64): [0 < 1 < 2 < 3]
内容的提问来源于stack exchange,提问作者Apoorva
相关产品推荐
相关产品推荐

