Pandas groupby (), agg () – как вернуть результаты без мультииндекса?

У меня есть кадр данных:

pe_odds[ [ 'EVENT_ID', 'SELECTION_ID', 'ODDS' ] ]
Out[67]: 
     EVENT_ID  SELECTION_ID   ODDS
0   100429300       5297529  18.00
1   100429300       5297529  20.00
2   100429300       5297529  21.00
3   100429300       5297529  22.00
4   100429300       5297529  23.00
5   100429300       5297529  24.00
6   100429300       5297529  25.00

Когда я использую groupby и agg, я получаю результаты с мультииндексом:

pe_odds.groupby( [ 'EVENT_ID', 'SELECTION_ID' ] )[ 'ODDS' ].agg( [ np.min, np.max ] )
Out[68]: 
                         amin   amax
EVENT_ID  SELECTION_ID              
100428417 5490293        1.71   1.71
          5881623        1.14   1.35
          5922296        2.00   2.00
          5956692        2.00   2.02
100428419 603721         2.44   2.90
          4387436        4.30   6.20
          4398859        1.23   1.35
          4574687        1.35   1.46
          4881396       14.50  19.00
          6032606        2.94   4.20
          6065580        2.70   5.80
          6065582        2.42   3.65
100428421 5911426        2.22   2.52

Я попытался использовать as_index для возврата результатов без multi_index:

pe_odds.groupby( [ 'EVENT_ID', 'SELECTION_ID' ], as_index=False )[ 'ODDS' ].agg( [ np.min, np.max ], as_index=False )

Но это все еще дает мне мультииндекс.

Я могу использовать .reset_index(), но это очень медленно:

pe_odds.groupby( [ 'EVENT_ID', 'SELECTION_ID' ] )[ 'ODDS' ].agg( [ np.min, np.max ] ).reset_index()

pe_odds.groupby( [ 'EVENT_ID', 'SELECTION_ID' ] )[ 'ODDS' ].agg( [ np.min, np.max ] ).reset_index()
Out[69]: 
     EVENT_ID  SELECTION_ID   amin   amax
0   100428417       5490293   1.71   1.71
1   100428417       5881623   1.14   1.35
2   100428417       5922296   2.00   2.00
3   100428417       5956692   2.00   2.02
4   100428419        603721   2.44   2.90
5   100428419       4387436   4.30   6.20

Как я могу вернуть результаты без мультииндекса, используя параметры функции groupby и/или agg. И не прибегая к помощи reset_index()?


person Ginger    schedule 12.10.2014    source источник


Ответы (1)


Ниже вызов:

>>> gr = df.groupby(['EVENT_ID', 'SELECTION_ID'], as_index=False)
>>> res = gr.agg({'ODDS':[np.min, np.max]})
>>> res
    EVENT_ID SELECTION_ID ODDS     
                          amin amax
0  100429300      5297529   18   25
1  100429300      5297559   30   38

возвращает фрейм с мультииндексными столбцами. Если вы не хотите, чтобы столбцы были мультииндексными, вы можете сделать это:

>>> res.columns = list(map(''.join, res.columns.values))
>>> res
    EVENT_ID  SELECTION_ID  ODDSamin  ODDSamax
0  100429300       5297529        18        25
1  100429300       5297559        30        38
person behzad.nouri    schedule 12.10.2014
comment
В pandas v0.24.0 для столбцов была введена функция .to_flat_index(). Что немного меняет команду на: res.columns = ["_".join(col_name).rstrip('_') for col_name in res.columns.to_flat_index()]. (Обратите внимание, как я присоединяюсь к _ вместо пустого пространства, чтобы объединить имена столбцов первого и второго уровня, используя символы подчеркивания вместо пробелов. Мне это кажется более питоническим, но это чисто мое личное предпочтение.) - person Kim; 26.03.2020