如何在Pandas中基于两个DataFrame生成取B列最小值的新DataFrame
高效实现按行选取DataFrame(基于B列最小值)
给定两个结构一致的DataFrame:
import pandas as pd df1 = pd.DataFrame({'A': [0, 2, 4], 'B': [2, 17, 7], 'C': [4, 9, 11]}) df2 = pd.DataFrame({'A': [9, 2, 32], 'B': [1, 3, 8], 'C': [6, 2, 41]})
需求:生成df3,每行从df1和df2的对应行中选取B列值更小的整行数据,最终结果如下:
A B C 0 9 1 6 1 2 3 2 2 4 7 11
要求避免逐行迭代,用高效的向量化方法实现。
方法1:利用numpy.where做向量化选择
这是最直接的向量化实现,通过比较两DataFrame的B列生成布尔掩码,再逐列选择对应值:
import numpy as np # 生成布尔数组:标记df2的B列是否小于df1的B列 mask = df2['B'] < df1['B'] # 逐列构造新DataFrame,根据mask选择df2或df1的值 df3 = pd.DataFrame({ col: np.where(mask, df2[col], df1[col]) for col in df1.columns })
np.where是完全向量化的操作,效率远高于逐行循环,适合处理大规模数据。
方法2:合并后按行索引分组取最小值行
把两个DataFrame按行堆叠,然后按原索引分组,每组选取B列最小的行:
# 合并两个DataFrame,保留原索引 combined = pd.concat([df1, df2]) # 按原索引分组,每组取B列最小的行(keep='first'确保B相等时优先取df1的行) df3 = combined.groupby(combined.index).apply(lambda x: x.loc[x['B'].idxmin()]).reset_index(drop=True)
这种方法扩展性更强,若后续需要对比多个DataFrame,只需添加到concat列表即可。
方法3:布尔索引拼接行
如果列数较少,可直接通过布尔索引筛选后拼接:
# 筛选df2中B更小的行,加上df1中B更小或相等的行,最后按原索引排序 df3 = pd.concat([df2[mask], df1[~mask]]).sort_index()
逻辑直观,代码简洁,适合快速实现需求。
内容的提问来源于stack exchange,提问作者k1r1t0
相关产品推荐
相关产品推荐

