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

DataFrame除指定列归一化赋值报错:Columns must be same length as key

DataFrame归一化赋值时抛出ValueError错误分析

问题背景

我有一个包含多列的DataFrame,需要对除price列外的所有列执行归一化处理。这段代码在我自己创建的示例DataFrame上运行完全正常,但在原始DataFrame执行时,抛出ValueError: Columns must be same length as key错误。单独执行归一化计算逻辑能得到结果,但把结果重新赋值回对应列时就失败了。

报错代码

df_final_1d_normalized = df_final_1d.copy()

cols_to_norm = df_final_1d.columns[df_final_1d.columns!='price']
df_final_1d_normalized[cols_to_norm] = df_final_1d_normalized[cols_to_norm].apply(lambda x: (x - x.min()) / (x.max() - x.min()))

测试用示例代码(运行正常)

import numpy as np
import pandas as pd

df  = pd.DataFrame()
df['A'] = [1,2,3,4, np.nan, np.nan]
df['B'] = [2,4,2,4,5,np.nan]
df['C'] = [np.nan, np.nan, 4,5,6,3]
df['D'] = [np.nan, np.nan, np.nan, 5,4,9]

df_norm = df.copy()
cols_to_norm = df.columns[df.columns!="D"]
df_norm[cols_to_norm] = df_norm[cols_to_norm].apply(lambda x: (x - x.min()) / (x.max() - x.min()))

错误原因

这个报错的核心是待赋值的列集合与归一化计算结果的列数/维度不匹配,常见触发场景:

  • 原始DataFrame存在重复列名:如果df_final_1d里有重复的非price列,apply处理后结果会自动合并去重列,导致列数减少,赋值时就会出现长度不匹配。而示例DataFrame列名唯一,所以无此问题。
  • 部分列归一化后返回非Series结果:比如某列全为NaN,x.min()和x.max()都是NaN,计算后得到标量NaN而非对应长度的Series,维度不匹配导致赋值失败。
  • 索引不匹配:原始DataFrame索引存在重复或不连续,apply处理后的结果索引与目标DataFrame索引不一致,也会触发长度错误。

解决方案

针对不同场景,对应处理方式如下:

  1. 检查并处理重复列名
    先执行以下代码查看是否有重复列:

    print(df_final_1d.columns.duplicated())
    

    如果存在重复列,可通过重命名或删除重复列解决,例如:

    # 重命名重复列
    df_final_1d = df_final_1d.T.reset_index(drop=True).T
    
  2. 修复归一化逻辑,处理极端情况
    修改归一化函数,避免除以0或全NaN的情况:

    def normalize_column(x):
        col_min = x.min()
        col_max = x.max()
        # 处理最大值等于最小值的情况(含全NaN)
        if col_max == col_min:
            return pd.Series([0.0]*len(x), index=x.index)
        return (x - col_min) / (col_max - col_min)
    
    df_final_1d_normalized[cols_to_norm] = df_final_1d_normalized[cols_to_norm].apply(normalize_column)
    
  3. 重置索引,解决索引不匹配问题
    先重置原始DataFrame的索引,再执行归一化:

    df_final_1d = df_final_1d.reset_index(drop=True)
    df_final_1d_normalized = df_final_1d.copy()
    # 后续归一化代码不变
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:17:22