2014-10-12 2 views
7

Ich habe einen Datenrahmen:Pandas groupby(), agg() - Wie Ergebnisse ohne den Multi-Index zurückgegeben werden?

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 

Wenn ich groupby und agg verwenden, erhalte ich Ergebnisse mit einem 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 

ich versucht habe as_index unter Verwendung der Ergebnisse ohne die multi_index zurückzukehren:

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

Aber es gibt mir immer noch einen Multi-Index.

Ich benutze .reset_index kann(), aber es ist sehr langsam:

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 

Wie kann ich die Ergebnisse zurück, ohne die Multi-Index, Parameter des groupby und/oder agg-Funktion. Und ohne auf reset_index() zurückgreifen zu müssen?

Antwort

6

Unten Anruf:

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

gibt einen Rahmen mit Mulit-Index Spalten. Wenn Sie nicht möchten, dass Spalten multi-index sind, können Sie auch Folgendes tun:

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