Python: cómo cambiar el nombre de las columnas mientras se leen varios archivos usando pandas

CorePress2024-01-25  10

Tengo dos marcos de datos (para archivos de Excel) con las siguientes columnas

Archivo 1- columnas

person_ID   Test_CODE   REGISTRATION_DATE   subject_CD   subject_DESCRIPTION    subject_TYPE

Archivo 2- columnas

person_ID   Test_CODE   REGISTRATION_DATE   subject_Code subject_DESCRIPTION    subject_Indicator

Sin embargo, las columnas asunto_CD y asunto_Código significan lo mismo. De manera similar, sujeto_TYPE y sujeto_Indicador significan lo mismo. Entonces, me gustaría cambiarles el nombre cuando lea el archivo de Excel

Probé lo siguiente pero no funciona

dfs = []       
for f in files:
    df = pd.read_excel(f, sep=",",low_memory=False)
    print(df.columns)
    df1 = df[df.columns.intersection(['person_ID','Test_CODE','REGISTRATION_DATE','subject_CD','subject_DESCRIPTION','subject_TYPE'])].rename(columns={'subject_TYPE':'subject_Indicator','subject_CD':'subject_Code'})
    dfs.append(df1)

Dado que me gustaría agregar/fusionar ambos archivos, espero que los nombres de las columnas en mi marco de datos final sean como se muestra a continuación

person_ID   Test_CODE   REGISTRATION_DATE   subject_Code subject_DESCRIPTION subject_Indicator

¿Puedes ayudarme con esto?

Por favor, publique el resultado esperado.

- Mayank Porwal

28 de marzo de 2021 a las 11:53

@MayankPorwal: actualizó los nombres de las columnas esperadas en el marco de datos final

- El gran

28 de marzo de 2021 a las 11:56



------------------------------------

Si desea conservar las columnas del primer archivo que se lee, puede hacer algo como esto que almacena las columnas de la primera iteración y asigna la columna al resto de los archivos:

dfs = []       
for e,f in enumerate(files):
    df = pd.read_excel(f)
    print(df.columns)
    if e == 0:
        col = df.columns
    df.columns=col
    dfs.append(df)


Index(['person_ID', 'Test_CODE', 'REGISTRATION_DATE', 'subject_CD',
       'subject_DESCRIPTION', 'subject_TYPE'],
      dtype='object')
Index(['person_ID', 'Test_CODE', 'REGISTRATION_DATE', 'subject_Code',
       'subject_DESCRIPTION', 'subject_Indicator'],
      dtype='object')
[df.columns for df in dfs] #pd.concat(dfs)

[Index(['person_ID', 'Test_CODE', 'REGISTRATION_DATE', 'subject_CD',
        'subject_DESCRIPTION', 'subject_TYPE'],
       dtype='object'),
 Index(['person_ID', 'Test_CODE', 'REGISTRATION_DATE', 'subject_CD',
        'subject_DESCRIPTION', 'subject_TYPE'],
       dtype='object')]

0



------------------------------------

Cambiar el nombre de 2 columnas de un df particular:

 df.rename({"subject_CD": "subject_Code", "subject_TYPE": "subject_Indicator"}, axis='columns', inplace =True) 

También puedes conectar df1 y df2 - en las mismas columnas:

frames = [df1, df2]
result = pd.concat(frames)

5

Gracias, votado a favor. Pero cuando leo el segundo archivo (en bucle), no tendrá la columna sujeto_CD, ¿verdad? ¿Eso no arrojaría un error?

- El gran

28/03/2021 a las 11:55

@piotr: quiere sugerir que df.rename no tendrá ningún efecto si una columna específica no está en el marco de datos. No arrojará ningún error, simplemente cambiará a la siguiente línea para su ejecución. ¿Tengo razón>

- El gran

28 de marzo de 2021 a las 11:58

para marcos de datos concat (deben tener columnas idénticas) si el df no contiene uncolumna - se puede agregar con el valor de NAN - o eliminar de la otra

– Piotr Żak

28 de marzo de 2021 a las 11:58

@TheGreat - basado en documentación - Puedes pasar: errores='ignorar' - argumento pandas.pydata.org/pandas-docs/stable/reference/api/…

– Piotr Żak

28/03/2021 a las 12:00

@TheGreat, ¿por qué no lo pruebas tú mismo?Lo acabo de probar en un DataFrame aleatorio y no se generaron errores ni advertencias.

-dm2

28/03/2021 a las 12:07

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare