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.

Jeremy G.
quelle

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
rgalbo
quelle
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.

JoeCondron
quelle
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])
ostrokach
quelle
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)

GoPackGo
quelle
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.

Alex P. Miller
quelle
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:]

ijoel92
quelle
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

rra
quelle
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
Fazley Rafy
quelle
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.

Yanger Rai
quelle
Dies gibt jedoch nur CSV aus, es ändert den Datenrahmen nicht, oder?
AMC