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