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