python - 如何从 pandas DataFrame 中的每个组中选择具有最高值的 N 行
问题描述
我正在寻找一种很好的通用方法来获得 2 个具有最高sharpe
值的策略ccyPair
。
数据框(在代码中):
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(表格视图):
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
一个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
推荐阅读
- javascript - 未捕获的 SyntaxError:递归函数中的非法返回语句
- github - 使用 GitHub Actions(和 GitHub Package Registry)自动化构建和发布过程
- javascript - 如何使用此 java 脚本设置表头行?
- javascript - 如何解决这个 java-script 文件的引用错误?
- java - Eclipse 2019-09 连接到 Team Foundation Server 无限循环
- python - 获取'AttributeError:'_io.TextIOWrapper'对象在打开并读取文件后调用split时没有属性'split''
- javascript - 如何在 MEVN 堆栈应用程序中从 MongoDB 返回当前用户信息
- javascript - 这可以以更有效的方式完成(目前使用 puppeteer)吗?
- javascript - 如何将道具传递给来自不同来源的组件?
- c++ - 麻烦开发简单的时钟和日期类