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

Pandas concat函数拼接DataFrame后维度异常问题求助

拼接DataFrame行数异常的原因与解决方法

问题描述

两个形状均为(8250x1)的DataFrame,使用pd.concat(axis=1)拼接后得到13783x2的结果,新增条目被NaN填充。拼接后的DataFrame示例如下:

LGL_fitted  LGL_actual
0      1.842137e-09         NaN
1      2.845566e-01         NaN
2      3.529837e-01         NaN
3      4.409625e-12    0.404955
4      6.357694e-02         NaN
...             ...         ...
22818           NaN    0.039901
16115           NaN    0.487271
10802           NaN    0.030231
12899           NaN    0.000000
18149           NaN    0.095125

[13783 rows x 2 columns]

对应的performance函数代码:

def performance(fitted, actual):
  # create one dataframe with fitted and actual values together
  if isinstance(actual,pd.DataFrame):
    actual.rename(columns={actual.columns[0]:'LGL_actual'}, inplace=True)
  else:
    actual = pd.DataFrame(actual.to_list(), columns = ['LGL_actual'])

  if isinstance(fitted,pd.DataFrame):
    fitted.rename(columns={fitted.columns[0]:'LGL_fitted'}, inplace=True)
  else:
    fitted = pd.DataFrame(fitted.to_list(), columns = ['LGL_fitted'])

  df = pd.concat([fitted, actual], axis=1)
  y_actual = df['LGL_actual']
  y_fitted = df['LGL_fitted']
  y_mean = np.mean(y_actual)
  SST = np.sum((y_actual - y_mean)** 2)
  SSR = np.sum((y_fitted - y_mean)** 2)
  R2 = SSR/SST

 # calculate mean squared error (MSE)
  MSE = np.mean((y_actual - y_fitted) ** 2)
  return R2, MSE, SST, SSR, df

原因分析

问题核心是索引不匹配:pd.concat(axis=1)默认按索引进行对齐合并。如果两个DataFrame的索引不完全一致(比如一个是默认连续索引,另一个带有非连续/重复/不重叠的索引值),合并时会保留所有索引,对缺失的对应位置填充NaN,最终总行数等于两个DataFrame索引的并集大小,而非原有的8250行。

从示例里的索引值(如22818、16115)能看出,其中一个DataFrame的索引并非连续的0~8249,和另一个DataFrame的索引重叠度不足,才导致合并后行数异常。

解决方案

合并前强制重置两个DataFrame的索引,让它们都使用从0开始的连续整数索引,确保行按位置完全对齐。修改代码中的拼接逻辑:

# 在concat前添加重置索引的操作
fitted = fitted.reset_index(drop=True)
actual = actual.reset_index(drop=True)
df = pd.concat([fitted, actual], axis=1)

完整修改后的performance函数:

def performance(fitted, actual):
  # create one dataframe with fitted and actual values together
  if isinstance(actual,pd.DataFrame):
    actual.rename(columns={actual.columns[0]:'LGL_actual'}, inplace=True)
  else:
    actual = pd.DataFrame(actual.to_list(), columns = ['LGL_actual'])

  if isinstance(fitted,pd.DataFrame):
    fitted.rename(columns={fitted.columns[0]:'LGL_fitted'}, inplace=True)
  else:
    fitted = pd.DataFrame(fitted.to_list(), columns = ['LGL_fitted'])

  # 重置索引,确保按位置对齐
  fitted = fitted.reset_index(drop=True)
  actual = actual.reset_index(drop=True)
  
  df = pd.concat([fitted, actual], axis=1)
  y_actual = df['LGL_actual']
  y_fitted = df['LGL_fitted']
  y_mean = np.mean(y_actual)
  SST = np.sum((y_actual - y_mean)** 2)
  SSR = np.sum((y_fitted - y_mean)** 2)
  R2 = SSR/SST

 # calculate mean squared error (MSE)
  MSE = np.mean((y_actual - y_fitted) ** 2)
  return R2, MSE, SST, SSR, df

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:42:16