[pandas] Denkanstoß zu reindex mit MultiIndex

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
dane
User
Beiträge: 3
Registriert: Mittwoch 23. März 2022, 20:04

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? :)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dane: Wie sollte denn in dem Beispiel das Ergebnis aussehen?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
dane
User
Beiträge: 3
Registriert: Mittwoch 23. März 2022, 20:04

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'.
dane
User
Beiträge: 3
Registriert: Mittwoch 23. März 2022, 20:04

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! :)
Antworten