You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

BMI数据集(500,4)分析代码报错:ValueError: 元素数量不匹配问题排查求助

解决BMI数据集分析代码的维度不匹配报错

首先,你的报错ValueError: Length mismatch: Expected axis has 12 elements, new values have 9 elements是因为拼接后的DataFrame列数和你定义的列名列表长度不一致,核心问题出在uniques列的生成逻辑上,另外还有几处小问题需要修正,具体如下:

问题1:uniques列的生成错误

你写的uniques = data.apply(lambda x: [x.unique])有两个明显问题:

  • x.unique是方法对象,没有调用执行,应该写成x.unique()来获取列的唯一值数组
  • 额外套了一层列表[],会导致pandas在拼接时可能把列表展开成多列(如果不同列的唯一值数量不同,就会出现列数膨胀)

应该修改为:

uniques = data.apply(lambda x: x.unique().tolist())

这样会返回一个Series,每个元素是对应列的唯一值列表,保证拼接时只占1列。

问题2:硬编码全局变量BMI_df

在计算相关性时,你用了corr = BMI_df.corr()[pred],但函数参数是data,这样不符合函数的封装性,如果传入其他数据集会报错,应该改为:

corr = data.corr()[pred]

问题3:字符串换行语法错误

你的print语句:

print('____________________________
Data types:
', dtypes)

在Python中这样的换行写法会导致语法错误,应该用\n来实现换行:

print('____________________________\nData types:\n', dtypes)

问题4:相关性列名和后续排序不匹配

你定义corr_col = 'corr' + pred,当pred='Weight'时列名是corrWeight,但后面排序用的是'corr Weight'(带空格),所以需要调整列名定义:

corr_col = 'corr ' + pred

修正后的完整代码

import pandas as pd

def detailed_analysis(data, pred = None):
    obs = data.shape[0]
    types = data.dtypes
    counts = data.apply(lambda x: x.count())
    # 修正uniques的生成逻辑
    uniques = data.apply(lambda x: x.unique().tolist())
    nulls = data.apply(lambda x: x.isnull().sum())
    distincts = data.apply(lambda x: x.unique().shape[0])
    missing_ratio = (nulls / obs)*100
    # 新增numeric_only,避免非数值列计算偏度/峰度报错
    skewness = data.skew(numeric_only=True)
    kurtosis = data.kurt(numeric_only=True)
    print('Data shape:', data.shape)
    if pred is None:
        cols = ['types', 'counts', 'nulls', 'distincts', 'missing_ratio', 'uniques', 'skewness', 'kurtosis']
        details = pd.concat([types, counts, nulls, distincts, missing_ratio, uniques, skewness, kurtosis], axis=1)
    else:
        # 用data代替BMI_df,避免硬编码全局变量
        corr = data.corr(numeric_only=True)[pred]
        details = pd.concat([types, counts, nulls, distincts, missing_ratio, uniques, skewness, kurtosis, corr], axis=1 , sort=False)
        # 修正列名,添加空格匹配后续排序需求
        corr_col = 'corr ' + pred
        cols = ['types', 'counts', 'nulls', 'distincts', 'missing_ratio', 'uniques', 'skewness', 'kurtosis', corr_col]
    details.columns = cols
    dtypes = details.types.value_counts()
    # 修正换行语法
    print('____________________________\nData types:\n', dtypes)
    print('____________________________')
    return details

# 假设BMI_df已完成加载
details = detailed_analysis(BMI_df, 'Weight')
display(details.sort_values(by='corr Weight', ascending=False))

另外,我还新增了numeric_only=True参数到skew()kurt()方法中,因为你的数据集里有Gender这样的字符串列,直接计算偏度和峰度会报错,这个参数可以只对数值型列计算,非数值列会返回NaN,避免报错。

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

火山引擎 最新活动