如何从 pandas DataFrame 中的每个组中 select N 行具有最高值
How to select N rows with highest values from every group in pandas DataFrame
我正在寻找一种很好的通用方法来为每个 ccyPair
.
获得 2 个具有最高 sharpe
值的策略
DataFrame(在代码中):
df = pd.DataFrame({
'ccyPair': ['EURUSD', 'EURUSD', 'EURUSD', 'USDJPY', 'USDJPY', 'USDJPY'],
'stype': ['SMA', 'Channel', 'Vol', 'SMA', 'Channel', 'Vol'],
'sharpe': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
})
DataFrame(table 视图):
ccyPair stype sharpe
0 EURUSD SMA 0.1
1 EURUSD Channel 0.2
2 EURUSD Vol 0.3
3 USDJPY SMA 0.4
4 USDJPY Channel 0.5
5 USDJPY Vol 0.6
预期结果有 2 个具有最佳夏普值的 EURUSD 和 2 个 USDJPY 策略:
ccyPair stype sharpe
0 EURUSD Channel 0.2
1 EURUSD Vol 0.3
2 USDJPY Channel 0.5
3 USDJPY Vol 0.6
使用 DataFrame.sort_values
with GroupBy.tail
作为最后一个最低值:
df = df.sort_values(['ccyPair','sharpe']).groupby('ccyPair').tail(2)
print (df)
ccyPair stype sharpe
1 EURUSD Channel 0.2
2 EURUSD Vol 0.3
4 USDJPY Channel 0.5
5 USDJPY Vol 0.6
编辑@cs95 - 如果使用 head
值的顺序不同 ;)
df = df.sort_values(['ccyPair','sharpe'], ascending=False).groupby('ccyPair').head(2)
print (df)
ccyPair stype sharpe
5 USDJPY Vol 0.6
4 USDJPY Channel 0.5
2 EURUSD Vol 0.3
1 EURUSD Channel 0.2
df = df.sort_values(['ccyPair','sharpe'], ascending=[True, False]).groupby('ccyPair').head(2)
print (df)
ccyPair stype sharpe
2 EURUSD Vol 0.3
1 EURUSD Channel 0.2
5 USDJPY Vol 0.6
4 USDJPY Channel 0.5
我正在寻找一种很好的通用方法来为每个 ccyPair
.
sharpe
值的策略
DataFrame(在代码中):
df = pd.DataFrame({
'ccyPair': ['EURUSD', 'EURUSD', 'EURUSD', 'USDJPY', 'USDJPY', 'USDJPY'],
'stype': ['SMA', 'Channel', 'Vol', 'SMA', 'Channel', 'Vol'],
'sharpe': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
})
DataFrame(table 视图):
ccyPair stype sharpe
0 EURUSD SMA 0.1
1 EURUSD Channel 0.2
2 EURUSD Vol 0.3
3 USDJPY SMA 0.4
4 USDJPY Channel 0.5
5 USDJPY Vol 0.6
预期结果有 2 个具有最佳夏普值的 EURUSD 和 2 个 USDJPY 策略:
ccyPair stype sharpe
0 EURUSD Channel 0.2
1 EURUSD Vol 0.3
2 USDJPY Channel 0.5
3 USDJPY Vol 0.6
使用 DataFrame.sort_values
with GroupBy.tail
作为最后一个最低值:
df = df.sort_values(['ccyPair','sharpe']).groupby('ccyPair').tail(2)
print (df)
ccyPair stype sharpe
1 EURUSD Channel 0.2
2 EURUSD Vol 0.3
4 USDJPY Channel 0.5
5 USDJPY Vol 0.6
编辑@cs95 - 如果使用 head
值的顺序不同 ;)
df = df.sort_values(['ccyPair','sharpe'], ascending=False).groupby('ccyPair').head(2)
print (df)
ccyPair stype sharpe
5 USDJPY Vol 0.6
4 USDJPY Channel 0.5
2 EURUSD Vol 0.3
1 EURUSD Channel 0.2
df = df.sort_values(['ccyPair','sharpe'], ascending=[True, False]).groupby('ccyPair').head(2)
print (df)
ccyPair stype sharpe
2 EURUSD Vol 0.3
1 EURUSD Channel 0.2
5 USDJPY Vol 0.6
4 USDJPY Channel 0.5