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

Python pandas多列重复计算训练集与理想集的平方偏差求和问题

问题分析与代码指导

你的单列计算代码是正确的,先拆解下逻辑:

  • train_df.y1 是400行的Series,ideal_df.loc[:,"y1":"y50"]是400行×50列的DataFrame
  • pandas会自动将Series广播到DataFrame的每一列,实现同一x值(对应行)的元素相减
  • 平方后得到每个位置的平方偏差,.sum()默认按列求和(axis=0),最终得到的Series里,每个值就是train_df.y1与ideal_df对应y列的400行平方偏差总和,完全符合需求。

扩展到所有train y列的实现

如果要一次性处理y1/y2/y3/y4四个列,有两种高效方式:

方式1:循环遍历(直观易读)

import pandas as pd

# 初始化空DataFrame存储结果
total_deviations = pd.DataFrame()

# 遍历train的每个y列
for train_col in ['y1', 'y2', 'y3', 'y4']:
    # 计算当前列与ideal所有y列的总平方偏差
    col_result = ((train_df[train_col] - ideal_df.loc[:, 'y1':'y50']) ** 2).sum()
    total_deviations[train_col] = col_result

# 结果:50行×4列的DataFrame,行是ideal的y1-y50,列是train的y1-y4,值为对应组合的总平方偏差

方式2:向量化运算(性能更优)

利用numpy的广播机制,避免循环:

import pandas as pd

# 提取train和ideal的y列数据
train_y = train_df[['y1', 'y2', 'y3', 'y4']].values
ideal_y = ideal_df.loc[:, 'y1':'y50'].values

# 扩展维度实现广播:train_y(400,4) → (400,4,1),ideal_y(400,50) → (400,1,50)
# 计算平方偏差后沿行维度求和,再转置成50×4的结构
result_array = ((train_y[:, :, None] - ideal_y[:, None, :]) ** 2).sum(axis=0).T

# 转换成带标签的DataFrame
total_deviations = pd.DataFrame(
    result_array,
    index=ideal_df.loc[:, 'y1':'y50'].columns,
    columns=['y1', 'y2', 'y3', 'y4']
)

关键注意事项

必须确保train_df和ideal_df的行顺序完全匹配(即每行对应的x值一致)。如果不确定行顺序是否正确,可以先按x值对齐:

# 将x设为索引,强制按x值对应
train_df = train_df.set_index('x')
ideal_df = ideal_df.set_index('x')

# 之后再提取y列进行计算,就不会出现x值不匹配的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:30:44