You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:41:02