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

Python实现非日期列缩放至起始值1遇问题:仅单列转换

问题解决:批量缩放DataFrame列至起始值为1

你的代码里有三个核心问题导致仅一列被转换:

  1. KeyError错误:原始字典x没有date键,执行l.insert(0, 'date', x['date'])会直接崩溃,后续代码根本没正常执行。
  2. 传参错误:最后调用price(x)时传入的是原始字典,不是处理后的DataFrame l——字典没有columns属性,函数里的遍历逻辑完全失效。
  3. 缩放逻辑偏差:先做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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:12:21