Zakładając, że mamy szablon DataFrame, który chciałoby się skopiować z zerowymi wartościami wypełnionymi tutaj ...
Jeśli w zestawie danych nie ma żadnych NaN, pomnożenie przez zero może być znacznie szybsze:
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
Ulepszenie zależy od rozmiaru DataFrame, ale nigdy nie było wolniej.
I po prostu do cholery:
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
Ale:
In [24]: %timeit d = orig_df.copy()
10 loops, best of 3: 24 ms per loop
EDYTOWAĆ!!!
Zakładając, że masz ramkę wykorzystującą float64, będzie to najszybsze z ogromnym marginesem! Jest również w stanie wygenerować dowolną wartość, zastępując 0,0 na żądany numer wypełnienia.
In [23]: %timeit d = pd.eval('orig_df > 1.7976931348623157e+308 + 0.0')
100 loops, best of 3: 3.68 ms per loop
W zależności od gustu można zdefiniować zewnętrznie nan i zrobić ogólne rozwiązanie, niezależnie od konkretnego typu spławika:
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