为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据列值获取数据帧切片的最大值?

如何根据列值获取数据帧切片的最大值?

喵喔喔 2023-11-09 21:58:02
MaxPriceBetweenEntries我正在寻找基于数据帧切片的 max()创建一个新列idx Price EntryBar ExitBar0   10.00 0        11   11.00 NaN      NaN2   10.15 2        43   12.14 NaN      NaN4   10.30 NaN      NaN转换成idx Price EntryBar ExitBar MaxPriceBetweenEntries0   10.00 0        1       11.001   11.00 NaN      NaN     NaN2   10.15 2        4       12.143   12.14 NaN      NaN     NaN4   10.30 NaN      NaN     NaNdf.loc[df["EntryBar"].notnull()]我可以使用和获取具有 EntryBar 或 ExitBar 值的所有行df.loc[df["ExitBar"].notnull()],但我无法使用它来设置新列:df.loc[df["EntryBar"].notnull(),"MaxPriceBetweenEntries"] = df.loc[df["EntryBar"]:df["ExitBar"]]["Price"].max()但这实际上是目前的猜测,因为我所做的一切都不起作用。理想情况下,解决方案不会直接涉及循环,因为可能有数百万行。
查看完整描述

4 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

您可以对非空条目的累积和进行分组并取最大值,unsingnp.where()仅适用于非空行::


df['MaxPriceBetweenEntries'] = np.where(df['EntryBar'].notnull(),

                                        df.groupby(df['EntryBar'].notnull().cumsum())['Price'].transform('max'),

                                        np.nan)

df

Out[1]: 

   idx  Price  EntryBar  ExitBar  MaxPriceBetweenEntries

0    0  10.00       0.0      1.0                   11.00

1    1  11.00       NaN      NaN                     NaN

2    2  10.15       2.0      4.0                   12.14

3    3  12.14       NaN      NaN                     NaN

4    4  10.30       NaN      NaN                     NaN


查看完整回答
反对 回复 2023-11-09
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

让我们尝试groupby()一下where:


s = df['EntryBar'].notna()

df['MaxPriceBetweenEntries'] = df.groupby(s.cumsum())['Price'].transform('max').where(s)

输出:


   idx  Price  EntryBar  ExitBar  MaxPriceBetweenEntries

0    0  10.00       0.0      1.0                   11.00

1    1  11.00       NaN      NaN                     NaN

2    2  10.15       2.0      4.0                   12.14

3    3  12.14       NaN      NaN                     NaN

4    4  10.30       NaN      NaN                     NaN


查看完整回答
反对 回复 2023-11-09
?
哔哔one

TA贡献1854条经验 获得超8个赞

您可以前向填充空值,按条目分组并获取该组的最大值。使用它作为左连接的右侧,您应该可以正常工作了。

df.merge(df.ffill().groupby('EntryBar')['Price'].max().reset_index(name='MaxPriceBetweenEntries'), 
                                                                   on='EntryBar', 
                                                                   how='left')


查看完整回答
反对 回复 2023-11-09
?
绝地无双

TA贡献1946条经验 获得超4个赞

尝试


df.loc[df['ExitBar'].notna(),'Max']=df.groupby(df['ExitBar'].ffill()).Price.max().values

df

Out[74]: 

   idx  Price  EntryBar  ExitBar    Max

0    0  10.00       0.0      1.0  11.00

1    1  11.00       NaN      NaN    NaN

2    2  10.15       2.0      4.0  12.14

3    3  12.14       NaN      NaN    NaN

4    4  10.30       NaN      NaN    NaN


查看完整回答
反对 回复 2023-11-09
  • 4 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信