Seite 1 von 1

[pandas] Denkanstoß zu reindex mit MultiIndex

Verfasst: Mittwoch 23. März 2022, 20:22
von dane
Hallo zusammen :)

Ich bräuchte mal einen Denkanstoß, weil ich das Gefühl habe, ziemlich auf dem Schlauch zu stehen.

Ich habe einen DataFrame mit str als Indices:

Code: Alles auswählen

	col1	col2	col3
A	2	1	5
B	NaN	7	1
C	2	3	4
Nun habe ich ein dict in welchem ein Teil der Indices zusätzlich um eine Eigenschaft beschrieben wird (man könnte natürlich auch ein Tuple nehmen):

Code: Alles auswählen

index_prop = {
	'A': 'gruen',
	'C': 'blau'
	}
Nun würde ich gern den DataFrame mit dem dict als MultiIndex reindexieren. Und genau da stehe ich auf dem oder besser den Schläuchen.

Ich kann zwar aus dem dict einen MultiIndex erstellen, allerdings beinhaltet dieser nicht alle Indices des DataFrames und damit klappt das mit DataFrame.reindex nicht. Die Indices im DataFrame sind aber das Resultat von pd.DataFrame.count_values(), weshalb ich das dict nicht einfach statisch ergänzen kann.

Eine andere Idee war, aus dem dict einen eigenen DataFrame zu erzeugen, den mit dem ursprünglichen zu kombinieren und dann mit den beiden Spalten des dict-DataFrames zu gruppieren (groupby()). Das kommt mir allerdings etwas umständlich und fehleranfällig vor.

Was meint Ihr? Geht das nicht auch eleganter? :)

Re: [pandas] Denkanstoß zu reindex mit MultiIndex

Verfasst: Donnerstag 24. März 2022, 11:54
von __blackjack__
@dane: Wie sollte denn in dem Beispiel das Ergebnis aussehen?

Re: [pandas] Denkanstoß zu reindex mit MultiIndex

Verfasst: Donnerstag 24. März 2022, 17:34
von dane
Das Ergebnis sollte so ausschauen:

Code: Alles auswählen

		col1	col2	col3
grün	A	2	1	5
	D	1	NaN	7
blau	C	2	3	4
n/a	B	NaN	7	1
Anm.: D ist gegenüber dem Eingangspost neu, weil die Gruppierung sonst keinen Sinn macht. Im dict wäre das also dann das Paar 'D': 'grün'.

Re: [pandas] Denkanstoß zu reindex mit MultiIndex

Verfasst: Freitag 25. März 2022, 17:43
von dane
Ich habe es jetzt gelöst indem ich das dict als Spalten zugefügt, den DataFrame mit den Werten des dict sortiert und zum Schluss das dict wieder aus dem dataFrame entfernt habe:

Code: Alles auswählen

df['prop'] = df.index.map(index_prop)
df = df.sort_index().sort_values('prop', kind='mergesort')
df.drop('prop', axis=1, inplace=True)
Wenn jemand noch Ideen hat, wie das eleganter oder besser zu lösen ist, gern her damit! :)