Python Pandas reemplazando el encabezado con la fila superior

83

Actualmente tengo un marco de datos que se parece a esto:

           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

Estoy buscando una forma de eliminar la fila de encabezado y hacer que la primera fila sea la nueva fila de encabezado, por lo que el nuevo marco de datos se vería así:

    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

He intentado cosas en la línea de if 'Unnamed' in df.columns:luego hacer el marco de datos sin el encabezado, df.to_csv(newformat,header=False,index=False)pero parece que no estoy llegando a ninguna parte.

Jeremy G
fuente

Respuestas:

152
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
fuente
46

El marco de datos se puede cambiar simplemente haciendo

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

Luego

df.to_csv(path, index=False) 

Debería hacer el truco.

JoeCondron
fuente
4
Esta es una respuesta mejor, porque no hay código redundante (new_header) en esto.
Ad Infinitum
34

Si quieres un one-liner, puedes hacer:

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

La respuesta de @ostrokach es la mejor. Lo más probable es que desee mantenerlo en todas las referencias al marco de datos, por lo que se beneficiaría de inplace = True.
df.rename(columns=df.iloc[0], inplace = True) df.drop([0], inplace = True)

GoPackGo
fuente
2

Aquí hay un truco simple que define los índices de columna "en su lugar". Debido a que set_indexestablece los índices de fila en su lugar, podemos hacer lo mismo para las columnas transponiendo el marco de datos, configurando el índice y transponiéndolo de nuevo:

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

Tenga en cuenta que puede que tenga que cambiar la 0de set_index(0)si sus filas tienen un índice diferente ya.

Alex P. Miller
fuente
2

Otro resumen usando el intercambio de Python:

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

Esto no restablecerá el índice

Aunque, lo contrario no funcionará como se esperaba df.columns, df = df.iloc[0], df[1:]

ijoel92
fuente
0

- otra forma de hacer esto


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

Si te gusta, presiona la flecha hacia arriba. Gracias

rra
fuente
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
fuente
Agregue una explicación
vsync
0

La mejor práctica y el mejor OneLiner :

df.to_csv(newformat,header=1)

Observe el valor del encabezado:

El encabezado se refiere a los números de fila que se utilizarán como nombres de columna. No se equivoque, el número de fila no es el df sino del archivo de Excel (0 es la primera fila, 1 es la segunda y así sucesivamente).

De esta manera, obtendrá el nombre de columna que desea y no tendrá que escribir códigos adicionales o crear un nuevo df.

Lo bueno es que deja caer la fila reemplazada.

Yanger Rai
fuente
Sin embargo, esto solo genera CSV, no cambia el marco de datos, ¿verdad?
AMC