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

