Sustitución de encabezado con fila superior

3 minutos de lectura

Avatar de usuario de Jeremy G
jeremy g

Actualmente tengo un marco de datos que se ve así:

       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 manera de eliminar la fila del encabezado y convertir la primera fila en la nueva fila del 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 a lo largo de las líneas de if 'Unnamed' in df.columns: luego haga el marco de datos sin el encabezado

df.to_csv(newformat, header=False, index=False)

pero parece que no estoy llegando a ninguna parte.

avatar de usuario de rgalbo
rgalbo

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

  • Cuando hago esto, el índice 0 también se convierte en parte del encabezado. ¿Hay alguna manera de eliminar el índice 0 de mi fila de encabezado?

    – Pete

    25 de marzo a las 12:14


  • @Pete ¿Cuál es el resultado que obtienes de df.columns?

    – rgalbo

    31 de marzo a las 17:21

Avatar de usuario de JoeCondron
josecondron

El marco de datos se puede cambiar simplemente haciendo

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

Después

df.to_csv(path, index=False) 

Debería hacer el truco.

  • Esta es una mejor respuesta, porque no hay código redundante (new_header) en esto.

    – Ad Infinito

    30 de octubre de 2017 a las 12:01

Si quieres una sola línea, puedes hacer:

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

  • Hazlo df.rename(columns=df.iloc[0]).drop(df.index[0]).reset_index(drop=True) si no desea que a su índice le falte algo.

    – z33k

    2 de noviembre de 2021 a las 12:13

  • funcionó para mí después de convertirlo en dos líneas ‘ df.rename(columns=df.iloc[0, :]inplace=True) df.drop(df.index[0]en el lugar=Verdadero)

    – Marc Steffen

    16 de noviembre de 2021 a las 22:32


Otro one-liner 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:]

Avatar de usuario de GoPackGo
GoPackGo

La respuesta de @ostrokach es la mejor. Lo más probable es que desee mantener eso 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)

Avatar de usuario de Alex P. Miller
Alex P Miller

Aquí hay un truco simple que define los índices de columna “en su lugar”. Porque set_index conjuntos fila índices en su lugar, podemos hacer lo mismo para las columnas al transponer el marco de datos, establecer el índice y volver a transponerlo:

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

Tenga en cuenta que es posible que tenga que cambiar el 0 en set_index(0) si sus filas ya tienen un índice diferente.

Avatar de usuario de Ransaka Ravihara
Ransaka Ravihara

Alternativamente, podemos hacer esto cuando leemos un archivo con pandas.

Este caso lo podemos usar,

pd.read_csv('file_path',skiprows=1)

Al leer el archivo, esto omitirá la primera fila y establecerá la columna como la segunda fila del archivo.

  • Esto no resuelve el problema. Se supone que los valores en la segunda fila no son los valores del encabezado. De hecho, esto es básicamente lo contrario de lo que debería ser la solución. Si skiprows=-1 hiciera que la primera fila se usara como encabezado, esa sería la solución. La solución aceptada logra el objetivo.

    – Antonio

    29 de septiembre de 2021 a las 14:01

¿Ha sido útil esta solución?