einen "Matrix"-Dataframe nach Zeilenstruktur umformen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
STBvM
User
Beiträge: 7
Registriert: Montag 20. Januar 2020, 20:59

Hallo zusammen,

ich möchte eine Excel-Tabelle mit folgendem Format zunächst in ein dataframe laden (das krieg ich hin mit read_excel):

Thema / Kontakt / M01 / M02 / M03
Topic1 / Maier / 100 / 150 / 200
Topic2 / Schmitt / 300 / 400 / 500

Die Spaltennamen M01, M02, M03 stehen zum Beispiel für die Monate Januar, Februar, März.

Daraus möchte ich nun folgende Tabelle "transponieren":

Thema / Kontakt / Monat / Wert
Topic1 / Maier / M01 / 100
Topic1 / Maier / M02 / 150
Topic1 / Maier / M03 / 200
Topic2 / Schmitt / M01 / 300
Topic2 / Schmitt / M02 / 400
Topic2 / Schmitt / M03 / 500

Gibt es da eine einfache Lösung mit slicing oder transpose oder...?
Habt einer von Euch einen Tip für mich?

Besten Dank und Grüße
Bodo
STBvM
User
Beiträge: 7
Registriert: Montag 20. Januar 2020, 20:59

...habe es nun doch schon geschafft, war wohl gestern etwas spät ;)
(aber: der Index in der neu geschaffenen umstrukturierten Tabelle ist nun 0,1,0,1,0,1 - kann ich den neu durchnummerieren lassen?)

Code: Alles auswählen

# erstmal die "Basisdaten" in ein eigenen Dataframe
df_basis=df_test.iloc[:,0:2]

#Schleife durch die Monatsspalten
for i in range(2, 5):
    #Werte je Monatsspalte in eigenes Dataframe
    df_werte=df_test.iloc[:,i]
    #Basisdaten und Werte aus Monatsspalte zusammenfügen
    df_temp= pd.concat([df_basis, df_werte], axis=1)
    #WerteSpalte umbenennen
    df_temp=df_temp.rename(columns={df_temp.columns[2]:'Wert'})
    #Spalte mit Monatswert hinzufügen
    df_temp['Monat'] = i-1
    #neue Ergebnistabelle zusammenfügen und jeweils neue Struktur anhängen 
    df_ergebn = df_ergebn.append(df_temp)

besten Dank und Grüße
Bodo
Benutzeravatar
__blackjack__
User
Beiträge: 14336
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@STBvM: Wie so oft wenn man bei Numpy, Pandas & Co selbst Schleifen schreibt, macht man etwas falsch:

Code: Alles auswählen

In [97]: df = pd.read_clipboard(delimiter=" / ")                                

In [98]: df                                                                     
Out[98]: 
    Thema  Kontakt  M01  M02  M03
0  Topic1    Maier  100  150  200
1  Topic2  Schmitt  300  400  500

In [99]: df.melt(id_vars=["Thema", "Kontakt"], var_name="Monat", value_name="Wert")                                                                    
Out[99]: 
    Thema  Kontakt Monat  Wert
0  Topic1    Maier   M01   100
1  Topic2  Schmitt   M01   300
2  Topic1    Maier   M02   150
3  Topic2  Schmitt   M02   400
4  Topic1    Maier   M03   200
5  Topic2  Schmitt   M03   500
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Antworten