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