
本文介绍如何从多个长度不一但列名相同的 dataframe 中提取指定列(如 'd'),横向拼接成新 dataframe,并自动对齐行索引以支持后续按行计算均值。
本文介绍如何从多个长度不一但列名相同的 dataframe 中提取指定列(如 'd'),横向拼接成新 dataframe,并自动对齐行索引以支持后续按行计算均值。
在实际数据分析中,常需整合来自不同来源(如实验重复、时间批次或模型输出)的多个 DataFrame,它们结构一致(列名相同),但行数不同。目标是提取统一列(例如 'd'),将其按原始顺序横向堆叠,形成宽表,便于逐行统计(如计算均值、标准差等)。关键在于:保留各 DataFrame 的原始行索引对齐关系,缺失位置自动填充 NaN,确保 mean(axis=1) 等操作正确生效。
推荐使用 pandas.concat() 配合 axis=1 和 keys 参数实现优雅拼接。核心步骤如下:
- 提取列并重命名:遍历 dataFrameList,对每个 DataFrame 提取目标列(如 'd'),并赋予唯一列名(如 'd1', 'd2', …);
- 横向拼接:使用 pd.concat(..., axis=1, keys=...) 按列合并,Pandas 自动基于索引对齐,短 DataFrame 对应位置补 NaN;
- 计算行均值:调用 .mean(axis=1) 即可获得每行有效数值的算术平均(默认跳过 NaN)。
以下是完整可运行示例(以列 'b' 为例,实际替换为 'd' 即可):
import pandas as pd
# 示例数据:各 DataFrame 行数不同,但均有列 'a', 'b', 'c'
df1 = pd.DataFrame({'a': [2, 3], 'b': [2, 3], 'c': [2, 3]})
df2 = pd.DataFrame({'a': range(5, 10), 'b': range(5, 10), 'c': range(5, 10)})
df3 = pd.DataFrame({'a': range(7, 11), 'b': range(7, 11), 'c': range(7, 11)})
df4 = pd.DataFrame({'a': range(8, 13), 'b': range(8, 13), 'c': range(8, 13)})
dataFrameList = [df1, df2, df3, df4]
target_col = 'b' # 替换为你需要的列名,如 'd'
# 生成新列名:b1, b2, b3, b4...
column_names = [f"{target_col}{i+1}" for i in range(len(dataFrameList))]
# 提取各 DataFrame 的 target_col,横向拼接,自动对齐索引
newDataFrame = pd.concat(
[df[target_col] for df in dataFrameList],
axis=1,
keys=column_names
)
# 计算每行均值(自动忽略 NaN)
newDataFrame['row_mean'] = newDataFrame.mean(axis=1)
print(newDataFrame)✅ 注意事项:
- pd.concat(..., axis=1) 默认按索引对齐,无需手动重置索引(若原始索引非默认整数,建议提前检查是否需 reset_index(drop=True) 统一对齐逻辑);
- 若需强制按位置而非索引对齐(如所有 DataFrame 均为默认 RangeIndex 且希望“左对齐”),可先统一索引:[df[target_col].reset_index(drop=True) for df in dataFrameList];
- mean(axis=1) 默认 skipna=True,即仅对非空值求均值;若需包含 NaN 的严格均值,设 skipna=False;
- 列名冲突时(如某 DataFrame 缺失 target_col),会报错,建议加 try/except 或预检:all(target_col in df.columns for df in dataFrameList)。
最终得到的 newDataFrame 是一个标准宽表,支持任意行级聚合操作,为后续分析(如可视化、异常检测、模型输入)奠定坚实基础。

















