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

2024-10-03 23:20:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望创建一个新列,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()]df.loc[df["ExitBar"].notnull()]获取具有EntryBar或ExitBar值的所有行,但我不能使用该值设置新列:

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

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


Tags: 数据df情况nan解决方案pricelocmax
3条回答

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

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

让我们试试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

您可以按非空项的累计和进行分组,并将最大值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

相关问题 更多 >