Python Pandas Ersetzen des Headers durch die oberste Zeile


79

Ich habe derzeit einen Datenrahmen, der so aussieht:

           Unnamed: 1    Unnamed: 2   Unnamed: 3  Unnamed: 4
0   Sample Number  Group Number  Sample Name  Group Name
1             1.0           1.0          s_1         g_1
2             2.0           1.0          s_2         g_1
3             3.0           1.0          s_3         g_1
4             4.0           2.0          s_4         g_2

Ich suche nach einer Möglichkeit, die Kopfzeile zu löschen und die erste Zeile zur neuen Kopfzeile zu machen, damit der neue Datenrahmen folgendermaßen aussehen würde:

    Sample Number  Group Number  Sample Name  Group Name
0             1.0           1.0          s_1         g_1
1             2.0           1.0          s_2         g_1
2             3.0           1.0          s_3         g_1
3             4.0           2.0          s_4         g_2

Ich habe versucht if 'Unnamed' in df.columns:, den Datenrahmen ohne Header df.to_csv(newformat,header=False,index=False)zu erstellen, aber ich komme anscheinend nicht weiter.

Antworten:


142
new_header = df.iloc[0] #grab the first row for the header
df = df[1:] #take the data less the header row
df.columns = new_header #set the header row as the df header

44

Der Datenrahmen kann einfach geändert werden

df.columns = df.iloc[0]
df = df[1:]

Dann

df.to_csv(path, index=False) 

Sollte den Trick machen.


3
Dies ist eine bessere Antwort, da darin kein redundanter Code (new_header) enthalten ist.
Ad Infinitum

30

Wenn Sie einen Einzeiler wünschen, können Sie Folgendes tun:

df.rename(columns=df.iloc[0]).drop(df.index[0])

3

@ostrokach Antwort ist am besten. Höchstwahrscheinlich möchten Sie dies bei allen Verweisen auf den Datenrahmen beibehalten und profitieren daher von inplace = True.
df.rename(columns=df.iloc[0], inplace = True) df.drop([0], inplace = True)


2

Hier ist ein einfacher Trick, der Spaltenindizes "an Ort und Stelle" definiert. Da set_indexSätze Reihe Indizes vorhanden ist , können wir die gleiche Sache für Spalten tun , indem Sie den Datenrahmen zur Umsetzung, Setzen des Index und ihre Umsetzung zurück:

df = df.T.set_index(0).T

Beachten Sie die ändern müssen möglicherweise 0in , set_index(0)wenn Ihre Zeilen bereits einen anderen Index haben.


1

Ein weiterer Einzeiler mit Python-Tausch:

df, df.columns = df[1:] , df.iloc[0]

Dadurch wird der Index nicht zurückgesetzt

Das Gegenteil funktioniert jedoch nicht wie erwartet df.columns, df = df.iloc[0], df[1:]


0

- Ein anderer Weg, dies zu tun


df.columns = df.iloc[0]
df = df.reindex(df.index.drop(0)).reset_index(drop=True)
df.columns.name = None

    Sample Number  Group Number  Sample Name  Group Name
0             1.0           1.0          s_1         g_1
1             2.0           1.0          s_2         g_1
2             3.0           1.0          s_3         g_1
3             4.0           2.0          s_4         g_2

Wenn es dir gefällt, drücke den Pfeil nach oben. Vielen Dank


0
header = table_df.iloc[0]
table_df.drop([0], axis =0, inplace=True)
table_df.reset_index(drop=True)
table_df.columns = header
table_df

Bitte fügen Sie eine Erklärung hinzu
vsync

0

Die beste Vorgehensweise und der beste OneLiner :

df.to_csv(newformat,header=1)

Beachten Sie den Header-Wert:

Die Kopfzeile bezieht sich auf die Zeilennummer (n), die als Spaltennamen verwendet werden sollen. Machen Sie keinen Fehler, die Zeilennummer ist nicht die df, sondern aus der Excel-Datei (0 ist die erste Zeile, 1 ist die zweite und so weiter).

Auf diese Weise erhalten Sie den gewünschten Spaltennamen und müssen keine zusätzlichen Codes schreiben oder neue df erstellen.

Gut ist, dass die ersetzte Zeile gelöscht wird.


Dies gibt jedoch nur CSV aus, es ändert den Datenrahmen nicht, oder?
AMC
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.