2017-02-03 6 views
0

Angesichts der Probleme mit groupby() und nlargest() wie beschrieben here und here. Ich versuche, die Probleme zu umgehen.Scheibe Original df nach groupby(). Nlargest (x) Betrieb

Hinweis: der Einfachheit halber verwendete ich nlargest(1), es könnte jedoch eine beliebige Anzahl von Auswahlen sein.

{'city1': {0: 'Chicago', 
    1: 'Chicago', 
    2: 'Chicago', 
    3: 'Chicago', 
    4: 'Miami', 
    5: 'Houston', 
    6: 'Austin'}, 
'city2': {0: 'Toronto', 
    1: 'Detroit', 
    2: 'St.Louis', 
    3: 'Miami', 
    4: 'Dallas', 
    5: 'Dallas', 
    6: 'Dallas'}, 
'p234_r_c': {0: 5.0, 1: 4.0, 2: 2.0, 3: 0.5, 4: 1.0, 5: 4.0, 6: 3.0}, 
'plant1_type': {0: 'COMBCYCL', 
    1: 'COMBCYCL', 
    2: 'NUKE', 
    3: 'COAL', 
    4: 'NUKE', 
    5: 'COMBCYCL', 
    6: 'COAL'}, 
'plant2_type': {0: 'COAL', 
    1: 'COAL', 
    2: 'COMBCYCL', 
    3: 'COMBCYCL', 
    4: 'COAL', 
    5: 'NUKE', 
    6: 'NUKE',}} 

A) GROUPBY city1 und Zeilen von Original df

cols2 = ['city1','plant1_type','plant2_type'] 
df.loc[df2.groupby(cols2)['p234_r_c'].nlargest(1).reset_index().level_3] 

    city1 city2 p234_r_c plant1_type plant2_type 
6 Austin Dallas  3.0 COAL  NUKE 
3 Chicago Miami  0.5 COAL  COMBCYCL 
0 Chicago Toronto  5.0 COMBCYCL COAL 
2 Chicago St.Louis  2.0 NUKE  COMBCYCL 
5 Houston Dallas  4.0 COMBCYCL NUKE 
4 Miami Dallas  1.0 NUKE  COAL 

Die obige gute Reihen sieht ausgewählt Rück

B) GROUPBY city2 und zurück von der ursprünglichen df ausgewählt

Da die Der gleiche Code, der in #A verwendet wird, erzeugt ein falsches Ergebnis, wenn versucht wird, für groupby city2 eine Workaround-Lösung zu erstellen die folgenden:

cols = ['city2','plant1_type','plant2_type'] 
df.set_index(cols).groupby(level=cols)['p234_r_c'].nlargest(1) 


city2  plant1_type plant2_type 
Toronto COMBCYCL  COAL   5.0 
Detroit COMBCYCL  COAL   4.0 
St.Louis NUKE   COMBCYCL  2.0 
Miami  COAL   COMBCYCL  0.5 
Dallas NUKE   COAL   1.0 
      COMBCYCL  NUKE   4.0 
      COAL   NUKE   3.0 

Nun, wie kann ich dieses Ergebnis verwenden, um die Zeilen aus der ursprünglichen df ausgewählt zurückzukehren wie ich in #A?

Hinweis: hatte der ursprüngliche df eine zusätzliche Reihe hatte, die das Ergebnis von groupby.nlargest() für city2 Gruppen gemacht, wo mindestens eine Gruppe eine Größe größer als 1 hat, dann kann der Code in #A für #B verwendet werden.

Antwort

2

Wenn ich nicht etwas verpasse (und ich stimme zu, dass hier Fehler im Pandas-Code lauern), können wir alle Schwierigkeiten relativ einfach umgehen.

Methode 1: Verwenden Sie loc und idxmax:

In [21]: df.loc[df.groupby(cols2)["p234_r_c"].idxmax()] 
Out[21]: 
    city1  city2 p234_r_c plant1_type plant2_type 
6 Austin Dallas  3.0  COAL  NUKE 
3 Chicago  Miami  0.5  COAL COMBCYCL 
0 Chicago Toronto  5.0 COMBCYCL  COAL 
2 Chicago St.Louis  2.0  NUKE COMBCYCL 
5 Houston Dallas  4.0 COMBCYCL  NUKE 
4 Miami Dallas  1.0  NUKE  COAL 

In [22]: df.loc[df.groupby(cols)["p234_r_c"].idxmax()] 
Out[22]: 
    city1  city2 p234_r_c plant1_type plant2_type 
6 Austin Dallas  3.0  COAL  NUKE 
5 Houston Dallas  4.0 COMBCYCL  NUKE 
4 Miami Dallas  1.0  NUKE  COAL 
1 Chicago Detroit  4.0 COMBCYCL  COAL 
3 Chicago  Miami  0.5  COAL COMBCYCL 
2 Chicago St.Louis  2.0  NUKE COMBCYCL 
0 Chicago Toronto  5.0 COMBCYCL  COAL 

Methode # 2: sortieren nach p234_r_c und verwenden last:

In [17]: df.sort_values("p234_r_c").groupby(cols2, as_index=False).last() 
Out[17]: 
    city1 plant1_type plant2_type  city2 p234_r_c 
0 Austin  COAL  NUKE Dallas  3.0 
1 Chicago  COAL COMBCYCL  Miami  0.5 
2 Chicago COMBCYCL  COAL Toronto  5.0 
3 Chicago  NUKE COMBCYCL St.Louis  2.0 
4 Houston COMBCYCL  NUKE Dallas  4.0 
5 Miami  NUKE  COAL Dallas  1.0 

In [18]: df.sort_values("p234_r_c").groupby(cols, as_index=False).last() 
Out[18]: 
     city2 plant1_type plant2_type city1 p234_r_c 
0 Dallas  COAL  NUKE Austin  3.0 
1 Dallas COMBCYCL  NUKE Houston  4.0 
2 Dallas  NUKE  COAL Miami  1.0 
3 Detroit COMBCYCL  COAL Chicago  4.0 
4  Miami  COAL COMBCYCL Chicago  0.5 
5 St.Louis  NUKE COMBCYCL Chicago  2.0 
6 Toronto COMBCYCL  COAL Chicago  5.0 

Wenn Sie mehrere in der Lage sein wollen, bekommen Antworten auch, während die größten und kleinsten sind gebrochen, ich denke, es ist am einfachsten zu sortieren und dann Kopf oder Schwanz zu verwenden. Zum Beispiel:

In [27]: df.sort_values("p234_r_c").groupby(cols, as_index=False).tail(2) 
Out[27]: 
    city1  city2 p234_r_c plant1_type plant2_type 
3 Chicago  Miami  0.5  COAL COMBCYCL 
4 Miami Dallas  1.0  NUKE  COAL 
2 Chicago St.Louis  2.0  NUKE COMBCYCL 
6 Austin Dallas  3.0  COAL  NUKE 
1 Chicago Detroit  4.0 COMBCYCL  COAL 
5 Houston Dallas  4.0 COMBCYCL  NUKE 
0 Chicago Toronto  5.0 COMBCYCL  COAL 
+0

sagen, wenn ich 'Methode # 1 'und machen Sie einen' groupby' nur mit 'cols = [ 'city1']' und wollen die 'größten 2 (oder N) von p234_r_c'. Ich habe folgendes mit 'N = 2' versucht und das Ergebnis ist dasselbe wie für' N = 1'. 'df.loc [df.groupby (cols2) [" p234_r_c "]. Idxmax (2)]' – codingknob

+0

für 'N = 2', sollten wir 2 Zeilen für Chicago haben. dh die folgende Zeile fehlt: 'Chicago \t Detroit \t 4,0 \t COMBCYCL \t COAL' – codingknob

+0

@codingknob:' idxmax' hat keinen 'n' Parameter, also wenn es irgendwo Dokumentation gibt, die darauf hinweist, dass es tut, bitte einen Fehler da wir müssen es beheben. :-( – DSM

Verwandte Themen