如何优雅高效地相加两个Pandas DataFrame并保留双方索引
对两个Pandas DataFrame按行位置相加并保留双方索引的优雅高效方法
你的需求是将两个行数相同的DataFrame按行位置对应相加(第n行加第n行),同时把双方的索引配对后作为结果的索引。以下是最优雅高效的实现方式:
核心解法:直接操作数值数组 + 构造复合索引
这种方法避开了Pandas的索引对齐开销,直接基于底层数值计算,同时一步完成索引构造,既高效又简洁:
import pandas as pd # 修正示例代码以匹配表格数据(原代码中table_one的列值与表格不一致) table_one = pd.DataFrame({'Col1': [0.5, 0.0], 'Col2': [1.0, 0.5]}, index=['Sample1', 'Sample2']) table_two = pd.DataFrame({'Col1': [0.0, 1.0], 'Col2': [1.0, 1.0]}, index=['Sample3', 'Sample4']) # 核心操作:按行位置相加 + 构造配对索引 result = pd.DataFrame( table_one.to_numpy() + table_two.to_numpy(), # 按位置逐元素相加 index=pd.MultiIndex.from_tuples(zip(table_one.index, table_two.index)), # 复合索引(推荐) columns=table_one.columns ) # 如果需要和示例完全一致的列表形式索引,替换index行: # index=[list(pair) for pair in zip(table_one.index, table_two.index)] print(result)
输出结果(复合索引版):
Col1 Col2 Sample1 Sample3 0.5 2.0 Sample2 Sample4 1.0 1.5
输出结果(列表索引版):
Col1 Col2 [Sample1, Sample3] 0.5 2.0 [Sample2, Sample4] 1.0 1.5
方法优势
- 高效:使用
.to_numpy()直接获取底层数值数组进行计算,避免了Pandas索引对齐的额外开销,运算速度最快 - 优雅:一行代码完成结果DataFrame的构造,逻辑清晰直观
- 灵活:可选择Pandas原生支持的复合索引(便于后续筛选、分组等操作),或匹配示例需求的列表形式索引
备选方案(适合复杂场景)
如果需要保留中间步骤,或处理行数动态匹配的场景,可以通过添加行号合并后计算:
# 给两个表添加行号用于对齐 table_one['row_id'] = range(len(table_one)) table_two['row_id'] = range(len(table_two)) # 按行号合并并计算和 merged = pd.merge(table_one, table_two, on='row_id') result = pd.DataFrame({ 'Col1': merged['Col1_x'] + merged['Col1_y'], 'Col2': merged['Col2_x'] + merged['Col2_y'] }, index=pd.MultiIndex.from_tuples(zip(merged.index_x, merged.index_y))) # 清理临时列 table_one.drop('row_id', axis=1, inplace=True) table_two.drop('row_id', axis=1, inplace=True)
这种方法可读性强,但效率略低于直接操作数组的方式,适合需要更多中间处理的场景。
内容的提问来源于stack exchange,提问作者Pm740
相关产品推荐
相关产品推荐

