如何从N个相似pandas DataFrame快速提取各单元格最大值?有无非循环方法?
多DataFrame对应位置取最大值的高效实现方法
问题背景
现有N个结构相似(列名、行数、索引完全一致)但数值不同的pandas DataFrame,需要生成一个新的DataFrame,其中每个单元格的值为所有输入DataFrame对应位置的最大值。要求实现最快的执行效率,且避免使用遍历每个DataFrame的循环写法。
示例输入代码:
import pandas as pd A = pd.DataFrame({"pt":[0.15,0.25,0.5,0.75,1], "A1": [2,8,45,15,64], "A2":[10,4,55,17,10], "A3": [-1,9,4,24,77] }) B = pd.DataFrame({"pt":[0.15,0.25,0.5,0.75,1], "A1": [7,11,35,12,47], "A2":[-55,45,78,3,0], "A3": [55,88,23,1,3] }) C = pd.DataFrame({"pt":[0.15,0.25,0.5,0.75,1], "A1": [5,45,15,17,37], "A2":[107,5,54,30,89], "A3": [-102,51,11,10,30] })
高效实现方法
方法1:pd.concat + groupby 原生简洁写法
这是pandas原生的无循环方案,通过堆叠DataFrame后按原始索引分组取最大值:
# 将所有目标DataFrame存入列表 df_list = [A, B, C] # 堆叠后按原行索引分组,每组取列最大值 result = pd.concat(df_list).groupby(level=0).max()
说明:pd.concat会把多个DataFrame按行堆叠,level=0指定按原始行索引分组,每组对应原DataFrame的同一行位置,最终输出结构与原DataFrame完全一致。
方法2:numpy向量化运算(极致性能)
如果追求最快执行速度,可借助numpy的向量化能力直接对数组取最大值,再转回DataFrame:
import numpy as np # 将所有DataFrame转为numpy数组,组成三维数组 arrays = [df.to_numpy() for df in df_list] # 沿第0轴(对应不同DataFrame的维度)取对应位置最大值 max_array = np.max(arrays, axis=0) # 转回DataFrame,保留原列名与索引 result = pd.DataFrame(max_array, columns=A.columns, index=A.index)
说明:numpy的底层运算比pandas分组操作更快,在DataFrame数量多、数据量大的场景下性能优势显著。需确保所有输入DataFrame结构完全一致,否则会出现数组维度不匹配的错误。
注意事项
- 必须保证所有输入DataFrame的列名、行数、索引完全对齐,否则会出现结果错位或报错。
- 若
pt这类标识列的数值在所有DataFrame中完全相同,两种方法都会自动保留其原始值(最大值即为自身),无需额外处理。
内容的提问来源于stack exchange,提问作者Tabish Izhar
相关产品推荐
相关产品推荐

