Python实现非日期列缩放至起始值1遇问题:仅单列转换
问题解决:批量缩放DataFrame列至起始值为1
你的代码里有三个核心问题导致仅一列被转换:
- KeyError错误:原始字典
x没有date键,执行l.insert(0, 'date', x['date'])会直接崩溃,后续代码根本没正常执行。 - 传参错误:最后调用
price(x)时传入的是原始字典,不是处理后的DataFramel——字典没有columns属性,函数里的遍历逻辑完全失效。 - 缩放逻辑偏差:先做
pct_change() * 100得到百分比变化值,再除以该列第一个值,这不是“起始值为1”的正确计算方式。
修正后的完整代码(基于原始数据缩放)
如果你的需求是让每列第一个值为1,后续值为当前值与初始值的比例,直接基于原始DataFrame处理:
import pandas as pd import numpy as np # 1. 补全带date的字典数据 x = { "calories": [420, 380, 390, 200, 890], "duration": [50, 40, 45, 76, 65], "age": [10, 80, 45, 56, 65], "date": pd.date_range(start='2024-01-01', periods=5) } l = pd.DataFrame(x) # 2. 定义缩放函数 def scale_to_start_one(df): scaled_df = df.copy() # 遍历除date外的所有列 for col in scaled_df.columns[1:]: scaled_df[col] = scaled_df[col] / scaled_df[col].iloc[0] return scaled_df # 3. 调用函数并输出结果 result = scale_to_start_one(l) print(result)
如果需要基于百分比变化数据缩放
如果你必须先计算百分比变化,再生成起始值为1的累积增长序列,用这段代码:
import pandas as pd import numpy as np x = { "calories": [420, 380, 390, 200, 890], "duration": [50, 40, 45, 76, 65], "age": [10, 80, 45, 56, 65], "date": pd.date_range(start='2024-01-01', periods=5) } l = pd.DataFrame(x) # 计算百分比变化并补全缺失值 pct_df = l.iloc[:, 1:].pct_change() * 100 pct_df.replace(np.nan, 0, inplace=True) pct_df.insert(0, 'date', l['date']) # 基于百分比变化生成起始值为1的序列 def scale_pct_to_start_one(df): scaled_df = df.copy() for col in scaled_df.columns[1:]: # 转换为增长因子后累积乘积 growth_factors = 1 + scaled_df[col] / 100 scaled_df[col] = growth_factors.cumprod() return scaled_df result = scale_pct_to_start_one(pct_df) print(result)
原代码仅转换一列的原因
你调用price(x)时传入的是原始字典,而字典没有columns属性,函数里的l.columns[1:]实际是在遍历字典的键,且由于字典的特性,遍历逻辑出现异常,最终看起来只有一列被转换。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

