python - 如何向 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 但没有奏效。
解决方案
你可以做一个交叉连接,然后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
推荐阅读
- scala - 创建 Reads 时使用 () 和 {} 有什么区别。使用 {} 时我必须显式调用 apply
- ios - 如何在 Firebase 中向用户发送验证电子邮件之前注销用户
- reactjs - 尝试使用 npm start 命令启动服务器时出现异常
- checkbox - 我们如何在 MFC 中为自绘列表控件添加复选框?
- c# - 添加依赖项时,AWS Lambda“进程在完成请求之前退出”
- python - 如何在 python 的 Axes3D 中使用循环绘制图例?
- c++ - qt5_wrap_cpp() 没有生成 cpp 文件,尽管它声称它会生成
- php - 在 laravel 中从存储库模式调用事件是否可以?
- javascript - 在Javascript中有条件地调用函数?
- android - 单击地图上的标记时滚动到特定的卡片位置