如何向 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 添加一个新列,该列从另一个数据帧返回同一组中更大的最小值的主要内容,如果未能解决你的问题,请参考以下文章