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

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

错误原因

  1. 参数传递错误:函数的col_name参数需要接收列名字符串(如'depth'),但你传入的是df['depth']——这是一列数据,函数执行df[col_name]时,会把整列数值当成列名去查找,自然找不到对应列,触发报错。
  2. 未读取数据集:你把文件路径字符串直接赋值给df,没有用pd.read_csv()将其转为DataFrame对象,导致函数无法对其进行列操作。
  3. 分箱逻辑冗余:循环会重复覆盖目标列,每次用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:25:26