首页 > 解决方案 > 如何从 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

标签: pythonpandasdataframegreatest-n-per-group

解决方案


用于最后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

推荐阅读