Digamos que tenemos dos marcos de datos de pandas. El primero no tiene nombres de columna:

no_col_names_df = pd.DataFrame(np.array([[1,2,3], [4,5,6], [7,8,9]]))

La segunda tiene:

col_names_df = pd.DataFrame(np.array([[10,2,3], [4,45,6], [7,18,9]]),
                           columns=['col1', 'col2', 'col3'])

Lo que quiero hacer es obtener una copia de la columna nombres de col_names_df a no_col_names_df para que se cree el siguiente marco de datos:

    col1    col2    col3
0   1       2       3
1   4       5       6
2   7       8       9

He probado lo siguiente:

new_df_with_col_names = pd.DataFrame(data=no_col_names_df, columns=col_names_df.columns)

Pero en lugar de valores de no_col_names_df obtengo NaN s.

5
balkon16 10 may. 2019 a las 18:41

4 respuestas

La mejor respuesta

Al igual que ha usado columnas del marco de datos con nombres de columna, puede usar valores del marco de datos sin nombres de columna:

new_df_with_col_names = pd.DataFrame(data=no_col_names_df.values, columns=col_names_df.columns)


In [4]: new_df_with_col_names = pd.DataFrame(data=no_col_names_df, columns=col_names_df.columns)

In [5]: new_df_with_col_names
Out[5]:
   col1  col2  col3
0   NaN   NaN   NaN
1   NaN   NaN   NaN
2   NaN   NaN   NaN

In [6]: new_df_with_col_names = pd.DataFrame(data=no_col_names_df.values, columns=col_names_df.columns)

In [7]: new_df_with_col_names
Out[7]:
   col1  col2  col3
0     1     2     3
1     4     5     6
2     7     8     9
2
jo9k 10 may. 2019 a las 15:46

La forma más simple es asignar directamente las columnas de col_names_df a las de no_col_names_df:

no_col_names_df.columns = col_names_df.columns

     col1  col2  col3
0     1     2     3
1     4     5     6
2     7     8     9
5
yatu 10 may. 2019 a las 15:48

Si está obteniendo nan, lo más probable es que el problema sea el parámetro de datos, intente esto:

new_df_with_col_names = pd.DataFrame(data=no_col_names_df.values, columns=col_names_df.columns)

Salida:

   col1  col2  col3
0     1     2     3
1     4     5     6
2     7     8     9
0
Yuca 10 may. 2019 a las 15:45

Éste:

pd.DataFrame(data=no_col_names_df, columns=col_names_df.columns)

Le da todos los marcos de datos 'NaN' porque pasa un marco de datos para construir un nuevo marco de datos y asignarle nuevos columns. Pandas esencialmente construye un marco de datos idéntico y hace reindex a lo largo de axis 1 en él. En otras palabras, ese comando es equivalente a hacer:

no_col_names_df.reindex(col_names_df.columns, axis=1)

Necesita cambiar directamente no_col_names_df.columns o pasar no_col_names_df.values

1
Andy L. 10 may. 2019 a las 16:44