Python 如何基于列值获取数据帧切片的最大值?

Python 如何基于列值获取数据帧切片的最大值?,python,pandas,dataframe,Python,Pandas,Dataframe,我希望创建一个新列,MaxPriceBetweentries基于数据帧片段的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

我希望创建一个新列,
MaxPriceBetweentries
基于数据帧片段的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()]
df.loc[df[“ExitBar”].notnull()]
获取具有EntryBar或ExitBar值的所有行,但我不能使用它设置新列:

df.loc[df["EntryBar"].notnull(),"MaxPriceBetweenEntries"] = df.loc[df["EntryBar"]:df["ExitBar"]]["Price"].max()

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

您可以按条目分组向前填充空值,并获得该组的最大价格。用它作为左连接的右侧,你应该在业务中

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

您可以按非空项的累计和进行分组,并取最大值,unsing
np.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
让我们试试
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
试一试


为什么你们的两个样品的价格栏不同?@Chris很抱歉,这是一个打字错误
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