Tạo khung dữ liệu gấu trúc không điền


103

Cách tốt nhất để tạo khung dữ liệu gấu trúc không điền có kích thước nhất định là gì?

Tôi đã sử dụng:

zero_data = np.zeros(shape=(len(data),len(feature_list)))
d = pd.DataFrame(zero_data, columns=feature_list)

Có cách nào tốt hơn để làm điều đó không?


1
Không, tôi không thể nghĩ ra bất kỳ cải tiến đáng kể nào về điều đó.
Dan Allan

Tôi gặp lỗi Bộ nhớ trên np.zeros, vì dữ liệu là một tập hợp lớn. Bất kỳ gợi ý về những gì tôi có thể làm? Tôi không có đầu ra nào khác ngoài "MemoryError". Tôi có 100GB RAM và dữ liệu chỉ là 20GB nhưng vẫn bị lỗi. Không có ý tưởng làm thế nào để gỡ lỗi nó, máy chủ ubuntu 64 bit. Tôi đã tìm kiếm một chút nhưng mọi người đều nói - hãy chia thành nhiều phần, nhưng dữ liệu này không thể được chia.
niedakh

Bạn có thể chỉ làm việc với data? Tại sao bạn cần tạo một cấu trúc khác để giữ nó?
Phillip Cloud

Câu trả lời:


137

Bạn có thể thử điều này:

d = pd.DataFrame(0, index=np.arange(len(data)), columns=feature_list)

2
Kiểm tra điều này tôi thấy %timeit temp = np.zeros((10, 11)); d = pd.DataFrame(temp, columns = ['col1', 'col2',...'col11'])mất 156 chúng tôi. Nhưng %timeit d = pd.DataFrame(0, index = np.arange(10), columns = ['col1', 'col2',...'col11'])mất 171 người. Tôi ngạc nhiên là nó không nhanh hơn chút nào.
emschorsch

3
Lưu ý rằng bạn có thể gặp phải vấn đề int / float nếu bạn sẽ làm điều gì đó như d.set_value(params)sau khi khởi tạo dđể chứa 0. Một sửa chữa dễ dàng là: d = pd.DataFrame(0.0, index=np.arange(len(data)), columns=feature_list).
ximiki 29/08/17

29

Tốt nhất là làm điều này với numpy theo ý kiến ​​của tôi

import numpy as np
import pandas as pd
d = pd.DataFrame(np.zeros((N_rows, N_cols)))

1
Khi tôi làm theo cách này, tôi không thể thay đổi các giá trị "0". TypeError: 'numpy.float64' object does not support item assignment
RightmireM

@RightmireM Chính xác thì bạn đang cố gắng thay đổi chúng như thế nào? Bạn nói đúng, kiểu dữ liệu lànp.float64
AlexG,

11

Tương tự như @Shravan, nhưng không sử dụng numpy:

  height = 10
  width = 20
  df_0 = pd.DataFrame(0, index=range(height), columns=range(width))

Sau đó, bạn có thể làm bất cứ điều gì bạn muốn với nó:

post_instantiation_fcn = lambda x: str(x)
df_ready_for_whatever = df_0.applymap(post_instantiation_fcn)

8

Nếu bạn muốn khung dữ liệu mới có cùng chỉ mục và các cột như khung dữ liệu hiện có, bạn chỉ có thể nhân khung dữ liệu hiện có với 0:

df_zeros = df * 0

2
Hãy lưu ý rằng bạn sẽ nhận được NaN thay vì số không ở bất cứ nơi nào df chứa NaN.
kadee

1

Nếu bạn đã có dataframe, đây là cách nhanh nhất:

In [1]: columns = ["col{}".format(i) for i in range(10)]
In [2]: orig_df = pd.DataFrame(np.ones((10, 10)), columns=columns)
In [3]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns)
10000 loops, best of 3: 60.2 µs per loop

So với:

In [4]: %timeit d = pd.DataFrame(0, index = np.arange(10), columns=columns)
10000 loops, best of 3: 110 µs per loop

In [5]: temp = np.zeros((10, 10))
In [6]: %timeit d = pd.DataFrame(temp, columns=columns)
10000 loops, best of 3: 95.7 µs per loop

1

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

1
Đây chắc chắn là câu trả lời toàn diện nhất về thời gian, mặc dù đối với OP, có vẻ như yêu cầu bộ nhớ là vấn đề chứ không phải tốc độ ... Nhân tiện, trên hệ thống của tôi, hai gợi ý đầu tiên mà bạn đã viết đưa ra cùng thời gian (Pandas 0.20.3 ), vì vậy có lẽ đã có một số thay đổi.
Moot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.