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

Posted

技术标签:

【中文标题】如何向 pandas df 添加一个新列,该列从另一个数据帧返回同一组中更大的最小值【英文标题】:How to add a new column to a pandas df that returns the smallest value that is greater in the same group from another dataframe 【发布时间】:2019-12-06 23:34:36 【问题描述】:

您好,我有以下两个 pandas 数据框: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 合并,但没有奏效。

【问题讨论】:

【参考方案1】:

您可以进行交叉连接,然后是 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

【讨论】:

嗨 Anky,谢谢它的工作。我唯一的问题是在大型数据集上运行代码时出现内存错误,例如我无法在 40,000 行上运行它。我还没有进行足够的测试来查看它在哪里发生故障,但是有没有办法可以做到这一点,这样它就不会出现内存错误?我知道很多时候它会一遍又一遍地计算相同的东西,因为 df1 中有重复项。 我做了 df1.drop_duplicates(keep=False, inplace=True) 现在它没有出现内存错误我认为这对我的使用来说应该足够了。感谢您的帮助!!!!

以上是关于如何向 pandas df 添加一个新列,该列从另一个数据帧返回同一组中更大的最小值的主要内容,如果未能解决你的问题,请参考以下文章

将新列从另一个表连接到 redshift/sql 表

根据其他列向 Panda 数据框添加新列

Pandas - 基于 str 包含从另一列创建新列/值

如何在pandas dataframe中为新列添加值?

如何更改 pandas DataFrame 的最后 7 列的列名? [复制]

根据其他数据框向熊猫数据框添加新列