Supondo que haja um modelo de DataFrame, qual gostaria de copiar com valores zero preenchidos aqui ...
Se você não tem NaNs em seu conjunto de dados, multiplicar por zero pode ser significativamente mais rápido:
In [19]: columns = ["col{}".format(i) for i in xrange(3000)]
In [20]: indices = xrange(2000)
In [21]: orig_df = pd.DataFrame(42.0, index=indices, columns=columns)
In [22]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns)
100 loops, best of 3: 12.6 ms per loop
In [23]: %timeit d = orig_df * 0.0
100 loops, best of 3: 7.17 ms per loop
A melhoria depende do tamanho do DataFrame, mas nunca o achei mais lento.
E só pra cacete:
In [24]: %timeit d = orig_df * 0.0 + 1.0
100 loops, best of 3: 13.6 ms per loop
In [25]: %timeit d = pd.eval('orig_df * 0.0 + 1.0')
100 loops, best of 3: 8.36 ms per loop
Mas:
In [24]: %timeit d = orig_df.copy()
10 loops, best of 3: 24 ms per loop
EDITAR!!!
Supondo que você tenha um quadro usando float64, este será o mais rápido por uma margem enorme! Ele também é capaz de gerar qualquer valor, substituindo 0,0 para o número de preenchimento desejado.
In [23]: %timeit d = pd.eval('orig_df > 1.7976931348623157e+308 + 0.0')
100 loops, best of 3: 3.68 ms per loop
Dependendo do gosto, pode-se definir nan externamente e fazer uma solução geral, independentemente do tipo de flutuador particular:
In [39]: nan = np.nan
In [40]: %timeit d = pd.eval('orig_df > nan + 0.0')
100 loops, best of 3: 4.39 ms per loop