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.

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

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.


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])

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)


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.


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:]


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


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

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.


Sin embargo, esto solo genera CSV, no cambia el marco de datos, ¿verdad?
AMC
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.