2014-10-12 16 views
7

Mam dataframe:Pandy groupby(), agg() - jak zwracać wyniki bez indeksu multi?

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 

Gdy używam GroupBy i AGG, mam wyniki z multi-index:

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 

Próbowałem, używając as_index zwrócić wyników bez multi_index:

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

Ale nadal daje mi multi-indeks.

mogę używać .reset_index(), ale jest bardzo powolny:

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 

Jak mogę powrócić wyników, bez Multi-index, używając parametrów GroupBy i/lub funkcji agg. I bez konieczności uciekania się do używania funkcji reset_index()?

Odpowiedz

6

Poniżej rozmowy:

>>> 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 

zwraca ramkę z mulit-index kolumny. Jeśli nie chcesz, aby kolumny były wieloindeksowe, możesz:

>>> 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