首页 > 解决方案 > 如何向 pandas df 添加一个新列,该列从另一个数据帧返回同一组中更大的最小值

问题描述

嗨,我有以下两个熊猫数据框:df1 和 df2。

我想创建一个新的数据框 df3 ,使其与 df1 相同,但有一个名为“新价格”的额外列。

我希望填充新价格的方式是从 df2 返回具有相同代码的第一个价格,该代码大于或等于 df1 中的价格。

以下是数据框:

df1:

Code    Price
X        4.3    
X        2.5    
X        4  
X        1.5    
X        0.24   
X        1  
X        1.3    
Y        3.9    
Y        2.6    

df2:

Code Price
X   0.5
X   1
X   1.5
X   2
X   2.5
X   3
X   3.5
X   4
X   4.5
X   5
X   5.5
Y   0.5
Y   1
Y   1.5
Y   2
Y   2.5
Y   3
Y   3.5
Y   4
Y   4.5
Y   5
Y   5.5

举个例子,让我们考虑 df1 中的第一个条目

Code Price
X    4.3

因此,新价格列应查看 df2 中代码为 X 的所有价格,并返回 df2 中大于或等于 4.3 的最小价格。

在这种情况下,它是 4.5。

对每一行重复此操作以获得

df3:

Code    Price   New Price
X        4.3       4.5
X        2.5       2.5
...
Y         2.6       3

有谁知道如何实现这一点,我尝试过 pandas merge 但没有奏效。

标签: pythonpython-3.xpandasdataframe

解决方案


你可以做一个交叉连接,然后query,最后groupby().first()

m=(df1.assign(key=1).merge(df2.assign(key=1),on='key',suffixes=('','_y')).drop('key', 1)
                                            .query("(Code==Code_y)&(Price<=Price_y)"))
m.groupby(['Code','Price'],sort=False)['Price_y'].first().reset_index(name='New Price')

  Code  Price  New Price
0    X   4.30        4.5
1    X   2.50        2.5
2    X   4.00        4.0
3    X   1.50        1.5
4    X   0.24        0.5
5    X   1.00        1.0
6    X   1.30        1.5
7    Y   3.90        4.0
8    Y   2.60        3.0

推荐阅读