
本文介绍如何从多个长度不一但结构相同的 DataFrame 中提取指定列(如 'd'),横向拼接成新 DataFrame,并支持按行计算均值,关键在于使用 pd.concat 配合 axis=1 和 keys 参数对齐列名。
本文介绍如何从多个长度不一但结构相同的 dataframe 中提取指定列(如 'd'),横向拼接成新 dataframe,并支持按行计算均值,关键在于使用 `pd.concat` 配合 `axis=1` 和 `keys` 参数对齐列名。
当你拥有多个具有相同列名(如 'a', 'b', 'c', 'd', 'e', 'f', 'g')但行数不同的 DataFrame(例如 df1 有 115 行、df2 有 220 行等),并希望提取每张表的 'd' 列,水平堆叠为一个宽表(列名为 d1, d2, ..., dn),以便后续按行计算均值(如 newDataFrame.mean(axis=1)),推荐采用 pandas.concat() 的列方向拼接方式。
核心思路是:不手动创建空 DataFrame 并逐列赋值(易出错且低效),而是利用 pd.concat(..., axis=1, keys=...) 自动对齐索引、保留缺失值(NaN),并生成带层级或扁平化列名的新结构。
以下是完整实现步骤:
✅ 正确做法:使用 pd.concat 横向拼接
import pandas as pd
# 示例数据(实际中替换为你的 df1, df2, ..., dfn)
df1 = pd.DataFrame({'a': [2, 3], 'b': [2, 3], 'c': [2, 3], 'd': [10, 20], 'e': [1, 2]})
df2 = pd.DataFrame({'a': [5, 6, 7], 'b': [5, 6, 7], 'c': [5, 6, 7], 'd': [100, 200, 300], 'e': [1, 2, 3]})
df3 = pd.DataFrame({'a': [7, 8, 9, 10], 'b': [7, 8, 9, 10], 'c': [7, 8, 9, 10], 'd': [1000, 2000, 3000, 4000], 'e': [1, 2, 3, 4]})
# 所有待处理的 DataFrame 列表
dataFrameList = [df1, df2, df3]
# 指定要提取的列名
target_col = 'd'
# 生成新列名:d1, d2, d3...
column_names = [f"{target_col}{i+1}" for i in range(len(dataFrameList))]
# 提取各 DataFrame 的 target_col,并横向拼接(自动按索引对齐,缺失处填 NaN)
newDataFrame = pd.concat(
[df[target_col] for df in dataFrameList],
axis=1,
keys=column_names,
# 可选:若需扁平化列名(去掉 MultiIndex),加以下参数
# names=None
)
print(newDataFrame)输出效果(自动对齐,短 DataFrame 补 NaN):
d1 d2 d3 0 10.0 100.0 1000.0 1 20.0 200.0 2000.0 2 NaN 300.0 3000.0 3 NaN NaN 4000.0
? 后续操作:按行计算均值(忽略 NaN)
# 计算每行的均值(自动跳过 NaN) newDataFrame['mean_d'] = newDataFrame.mean(axis=1) print(newDataFrame[['mean_d']])
⚠️ 注意事项
- 索引对齐是关键:pd.concat(..., axis=1) 默认基于索引(index)对齐行。若原始 DataFrame 索引非默认整数(如自定义字符串索引或重复索引),请先确保索引一致,或使用 reset_index(drop=True) 统一索引。
- 避免列名冲突:示例中用 keys= 生成唯一列名(如 d1, d2),防止直接拼接导致列名重复。
- 性能提示:对于大量 DataFrame(如数百个),建议用列表推导式预提取 Series,而非循环 assign() 或 join(),concat 是最高效方案。
- 替代方案(不推荐):pd.DataFrame([df['d'].values for df in dataFrameList]).T 会丢失索引信息且无法自动对齐,仅适用于所有 DataFrame 行数严格相等的场景。
通过该方法,你可稳健构建用于行统计分析的宽格式数据结构,为后续均值、标准差、最大值等聚合运算奠定基础。

















