Giả sử có một DataFrame mẫu, mẫu nào muốn sao chép với các giá trị 0 được điền vào đây ...
Nếu bạn không có NaN trong tập dữ liệu của mình, việc nhân với 0 có thể nhanh hơn đáng kể:
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
Sự cải thiện phụ thuộc vào kích thước DataFrame, nhưng không bao giờ thấy nó chậm hơn.
Và chỉ vì cái quái của nó:
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
Nhưng:
In [24]: %timeit d = orig_df.copy()
10 loops, best of 3: 24 ms per loop
BIÊN TẬP!!!
Giả sử bạn có một khung sử dụng float64, thì đây sẽ là tốc độ nhanh nhất với lợi nhuận rất lớn! Nó cũng có thể tạo ra bất kỳ giá trị nào bằng cách thay thế 0,0 thành số điền mong muốn.
In [23]: %timeit d = pd.eval('orig_df > 1.7976931348623157e+308 + 0.0')
100 loops, best of 3: 3.68 ms per loop
Tùy thuộc vào sở thích, người ta có thể xác định bên ngoài nan và thực hiện một giải pháp chung, bất kể loại phao cụ thể:
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