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
相关产品推荐
相关产品推荐

