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

Python DataFrame归一化报错:ValueError: Columns must be same length as key

问题:按指定频率归一化DataFrame时触发ValueError

我尝试编写一个函数,用于按指定频率对给定的DataFrame进行归一化。直接执行df2/df2.max()能得到预期结果,但函数运行时抛出错误。

代码

import numpy as np
import pandas as pd
def timeseries_dataframe_normalized(df, normalization_freq = 'complete'):
    """
    Input: 
        df : dataframe 
             input dataframe
        normalization_freq : string
            'daily', 'weekly', 'monthly','quarterly','yearly','complete' (default)
    Return: normalized dataframe
    
    """
    # auxiliary dataframe
    adf = df.copy()
    # convert columns to float
    adf = adf.astype(float)
    # normalized columns
    nor_cols = adf.columns
    # add suffix to columns and create new names for maximum columns
    max_cols = adf.add_suffix('_max').columns
    # initialize maximum columns
    adf.loc[:,max_cols] = np.nan
    # check the requested frequency
    if normalization_freq =='complete':
        adf[max_cols] = adf[nor_cols].max()
    # compute and return the normalized dataframe
    print(adf[nor_cols])
    print(adf[max_cols])
    adf[nor_cols] = adf[nor_cols]/adf[max_cols]
    # return the normalized dataframe
    return adf[nor_cols]
    
# Example
df2 = pd.DataFrame(data={'A':[20,10,30],'B':[1,2,3]})
timeseries_dataframe_normalized(df2)

预期输出

A         B
0   0.666667    0.333333
1   0.333333    0.666667
2   1.000000    1.000000

当前错误

运行函数时抛出:

ValueError: Columns must be same length as key

解决方案

错误原因

当执行adf[max_cols] = adf[nor_cols].max()时,adf[nor_cols].max()返回的是一维Series(每个元素对应原DataFrame列的最大值),而adf[max_cols]是二维列集合(包含多行数据),直接赋值会因为维度不匹配触发错误。

修改方案

方案1:简化逻辑(推荐)

不需要额外创建max_cols列存储最大值,直接用原列的最大值做广播除法即可:

import numpy as np
import pandas as pd
def timeseries_dataframe_normalized(df, normalization_freq = 'complete'):
    """
    Input: 
        df : dataframe 
             input dataframe
        normalization_freq : string
            'daily', 'weekly', 'monthly','quarterly','yearly','complete' (default)
    Return: normalized dataframe
    
    """
    adf = df.copy().astype(float)
    nor_cols = adf.columns
    
    if normalization_freq == 'complete':
        # 利用pandas广播特性直接做除法
        adf[nor_cols] = adf[nor_cols] / adf[nor_cols].max()
    
    return adf[nor_cols]
    
# Example
df2 = pd.DataFrame(data={'A':[20,10,30],'B':[1,2,3]})
print(timeseries_dataframe_normalized(df2))

方案2:保留原逻辑并修复维度问题

如果坚持要保留max_cols的设计,需要将一维的最大值结果转为二维,广播到所有行:

if normalization_freq =='complete':
    # 将一维最大值转为二维数组,实现行广播
    adf[max_cols] = adf[nor_cols].max().to_numpy()[np.newaxis, :]

两种方案都能让函数正确执行并输出预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:33:11