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

MaxPriceBetweenEntries我正在寻找基于数据帧切片的 max()创建一个新列


idx Price EntryBar ExitBar

0   10.00 0        1

1   11.00 NaN      NaN

2   10.15 2        4

3   12.14 NaN      NaN

4   10.30 NaN      NaN

转换成


idx Price EntryBar ExitBar MaxPriceBetweenEntries

0   10.00 0        1       11.00

1   11.00 NaN      NaN     NaN

2   10.15 2        4       12.14

3   12.14 NaN      NaN     NaN

4   10.30 NaN      NaN     NaN

df.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()

但这实际上是目前的猜测,因为我所做的一切都不起作用。理想情况下,解决方案不会直接涉及循环,因为可能有数百万行。


喵喔喔
浏览 96回答 4
4回答

湖上湖

您可以对非空条目的累积和进行分组并取最大值,unsingnp.where()仅适用于非空行::df['MaxPriceBetweenEntries'] = np.where(df['EntryBar'].notnull(),                                        df.groupby(df['EntryBar'].notnull().cumsum())['Price'].transform('max'),                                        np.nan)dfOut[1]:    idx  Price  EntryBar  ExitBar  MaxPriceBetweenEntries0    0  10.00       0.0      1.0                   11.001    1  11.00       NaN      NaN                     NaN2    2  10.15       2.0      4.0                   12.143    3  12.14       NaN      NaN                     NaN4    4  10.30       NaN      NaN                     NaN

小怪兽爱吃肉

让我们尝试groupby()一下where:s = df['EntryBar'].notna()df['MaxPriceBetweenEntries'] = df.groupby(s.cumsum())['Price'].transform('max').where(s)输出:   idx  Price  EntryBar  ExitBar  MaxPriceBetweenEntries0    0  10.00       0.0      1.0                   11.001    1  11.00       NaN      NaN                     NaN2    2  10.15       2.0      4.0                   12.143    3  12.14       NaN      NaN                     NaN4    4  10.30       NaN      NaN                     NaN

哔哔one

您可以前向填充空值,按条目分组并获取该组的最大值。使用它作为左连接的右侧,您应该可以正常工作了。df.merge(df.ffill().groupby('EntryBar')['Price'].max().reset_index(name='MaxPriceBetweenEntries'),                                                                     on='EntryBar',                                                                     how='left')

绝地无双

尝试df.loc[df['ExitBar'].notna(),'Max']=df.groupby(df['ExitBar'].ffill()).Price.max().valuesdfOut[74]:    idx  Price  EntryBar  ExitBar    Max0    0  10.00       0.0      1.0  11.001    1  11.00       NaN      NaN    NaN2    2  10.15       2.0      4.0  12.143    3  12.14       NaN      NaN    NaN4    4  10.30       NaN      NaN    NaN
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python