Slice original df nach groupby () nlarest (x) Operation

Angesichts der Probleme mit groupby() und nlargest() wie hier und hier beschrieben . Ich versuche, die Probleme zu lösen.

Anmerkung: Für die Einfachheit habe ich nlargest(1) , aber es könnte eine beliebige Anzahl von Selektionen sein.

  • Python groupby Verhalten?
  • Pandas gruppieren, um NAs zu ignorieren
  • Python: Gruppendetails in einem Dict
  • Pivot Tables oder Group By für Pandas?
  • Pandas, mehrere Funktionen von mehreren Spalten auf groupby-Objekt anwenden
  • Pandas nach Datum
  •  {'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 city1 ausgewählt aus 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 

    Das oben sieht gut aus

    B) groupby city2 und city2 aus Original df

    Da der gleiche Code, der in #A verwendet wird, ein falsches Ergebnis erzeugt, wenn es für die Gruppe von city2 versucht wird, wurde ein Workaround vorgeschlagen, um Folgendes zu tun:

     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 benutze ich dieses Ergebnis, um die aus dem Original df ausgewählten Zeilen zurückzugeben, wie ich es in #A gemacht habe?

    Anmerkung : hatte das Original df eine zusätzliche Zeile, die das Ergebnis von groupby.nlargest() für city2 haben Gruppen, bei denen mindestens eine Gruppe eine Größe größer als 1 hat, dann kann der Code in #A für #B .

  • Verwenden Sie den MongoDB-Server für den Unit-Test
  • Starten von Sellerie in Flasche: AttributeError: 'Flask' Objekt hat kein Attribut 'user_options'
  • Python Looping durch String und Matching es mit Wildcard-Muster
  • Erstellen Sie einen Bigram aus einer Spalte in Pandas df
  • Die Meinung eines Satzes als positiv oder negativ zu finden
  • Warum ist mein Pygame-Display nichts?
  • One Solution collect form web for “Slice original df nach groupby () nlarest (x) Operation”

    Es sei denn, ich vermisse etwas (und ich bin damit einverstanden, dass hier Bugs im Pandas-Code lauern), können wir 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: sortiere nach p234_r_c und benutze 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 du in der Lage wärst, mehrere Antworten zu bekommen, während nlestest und nsmallest sind gebrochen, ich denke, es ist am einfachsten zu sortieren und dann Kopf oder Schwanz zu verwenden. Beispielsweise:

     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 
    Python ist die beste Programmiersprache der Welt.