如何从 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