Saltar al contenido

¿Hay alguna forma de copiar solo la estructura (no los datos) de un Pandas DataFrame?

Solución:

Eso es un trabajo para reindex_like. Comience con el original:

df1 = pd.DataFrame([[11, 12], [21, 22]], columns=['c1', 'c2'], index=['i1', 'i2'])

Construya un DataFrame vacío y vuelva a indexarlo como df1:

pd.DataFrame().reindex_like(df1)
Out: 
    c1  c2
i1 NaN NaN
i2 NaN NaN   

En la versión 0.18 de pandas, el constructor de DataFrame no tiene opciones para crear un marco de datos como otro marco de datos con NaN en lugar de los valores.

El código que usas df2 = pd.DataFrame(columns=df1.columns, index=df1.index) es la forma más lógica, la única forma de mejorarlo es explicar aún más lo que está haciendo es agregar data=None, para que otros codificadores vean directamente que omite intencionalmente los datos de este nuevo DataFrame que está creando.

TLDR: Entonces mi sugerencia es:

Explícito es mejor que implícito

df2 = pd.DataFrame(data=None, columns=df1.columns, index=df1.index)

Muy parecido al tuyo, pero más detallado.

Comencemos con algunos datos de muestra

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([[1, 'a'], [2, 'b'], [3, 'c']],
   ...:                   columns=['num', 'char'])

In [3]: df
Out[3]: 
   num char
0    1    a
1    2    b
2    3    c

In [4]: df.dtypes
Out[4]: 
num      int64
char    object
dtype: object

Ahora usemos un simple DataFrame inicialización usando las columnas del original DataFrame pero sin proporcionar datos:

In [5]: empty_copy_1 = pd.DataFrame(data=None, columns=df.columns)

In [6]: empty_copy_1
Out[6]: 
Empty DataFrame
Columns: [num, char]
Index: []

In [7]: empty_copy_1.dtypes
Out[7]: 
num     object
char    object
dtype: object

Como puede ver, los tipos de datos de la columna no son los mismos que en nuestro original DataFrame.

Entonces, si desea conservar la columna dtype

Si desea conservar los tipos de datos de la columna, debe construir el DataFrame uno Series a la vez

In [8]: empty_copy_2 = pd.DataFrame.from_items([
   ...:     (name, pd.Series(data=None, dtype=series.dtype))
   ...:     for name, series in df.iteritems()])

In [9]: empty_copy_2
Out[9]: 
Empty DataFrame
Columns: [num, char]
Index: []

In [10]: empty_copy_2.dtypes
Out[10]: 
num      int64
char    object
dtype: object
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *