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