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: 13919
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
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Antworten