
本文介绍使用pandas按指定`iteration`值从多个dataframe中提取对应行,并沿列方向(`axis=1`)拼接为宽格式结果表,适用于性能测试数据对齐、多组实验指标对比等场景。
在实际数据分析中,常需将来自不同实验轮次或配置的结构化结果(如IOPS、延迟等性能指标)按特定标识(如iteration)进行横向对齐,而非传统意义上的键连接(merge/join)。此时,若目标行顺序不一致、存在缺失或需严格按用户指定序列排列,则直接使用reindex配合concat是更可控、更高效的方法。
核心思路:索引对齐 + 列向拼接
关键在于先将iteration设为索引,再按目标列表重排行序(reindex),确保每个DataFrame输出的行顺序和内容完全符合预期;随后通过pd.concat(..., axis=1)实现列级拼接,生成类似“双栏对照表”的结构。
✅ 基础实现(两个DataFrame)
import pandas as pd
# 定义对齐函数:按指定iteration列表提取并保持顺序
def align_by_iteration(df, target_iters):
return (df.set_index('iteration')
.reindex(target_iters) # 严格按target_iters顺序取行,缺失则填充NaN
.reset_index())
# 指定各DataFrame所需提取的iteration
iter_df1 = ['1_1', '2_2', '3_3', '9_9']
iter_df2 = ['1_1', '2_2', '5_5', '6_6']
# 对齐后水平拼接
df3 = pd.concat([
align_by_iteration(df1, iter_df1),
align_by_iteration(df2, iter_df2)
], axis=1)
print(df3)输出说明:结果中前3列来自df1(iteration, IOPS, Latency),后3列来自df2,两组iteration列独立存在,行顺序由各自target_iters决定——即第0行对应1_1,第1行对应2_2,依此类推。注意:reindex会自动用NaN填充未匹配的iteration(本例中无缺失,故未体现)。
? 扩展方案:支持N个DataFrame批量处理
当需对更多DataFrame执行相同逻辑时,推荐使用itertools.starmap提升可维护性:
from itertools import starmap
# 批量定义:DataFrame列表 + 对应的iteration列表
dataframes = [df1, df2]
iteration_lists = [
['1_1', '2_2', '3_3', '9_9'],
['1_1', '2_2', '5_5', '6_6']
]
# 一行完成全部对齐与拼接
df3 = pd.concat(
starmap(align_by_iteration, zip(dataframes, iteration_lists)),
axis=1
)该写法清晰分离了“数据源”与“抽取规则”,便于后续扩展(如加入df3、df4)或动态生成iteration_lists。
⚠️ 注意事项与最佳实践
- reindex vs loc:reindex会保留目标列表中的重复项并允许缺失(填NaN),而df.set_index('iteration').loc[target_iters]要求所有值必须存在,否则抛出KeyError。推荐优先使用reindex以增强鲁棒性。
-
列名冲突处理:若多个DataFrame包含同名列(如都含IOPS),拼接后将自动添加.1, .2后缀。如需统一前缀,可在align_by_iteration中加入列重命名:
.add_prefix('df1_') # 在 reset_index() 前调用 - 性能提示:对超大DataFrame,避免多次set_index。可预先构建索引版本缓存复用。
- 空值检查:建议拼接后用df3.isna().sum()快速验证是否有意外缺失,尤其当iteration拼写不一致时(如'1_1 '含空格)。
通过上述方法,你不仅能精准控制每行数据的来源与顺序,还能灵活适配任意数量的数据源,为实验报告、A/B测试分析或自动化监控看板提供坚实的数据整合基础。










