2013-03-21 38 views
6

Làm thế nào tôi có thể sử dụng pd.read_csv() để lặp đi lặp lại đoạn thông qua một tập tin và giữ lại dtype và meta-thông tin khác như thể tôi đọc trong toàn bộ bộ dữ liệu cùng một lúc?Get loại dataframe suy ra lặp đi lặp lại sử dụng chunksize

Tôi cần đọc trong tập dữ liệu quá lớn để vừa với bộ nhớ. Tôi muốn nhập tập tin bằng cách sử dụng pd.read_csv và sau đó ngay lập tức nối đoạn vào một HDFStore. Tuy nhiên, suy luận kiểu dữ liệu không biết gì về các khối tiếp theo.

Nếu đoạn đầu tiên được lưu trữ trong bảng chỉ chứa int và đoạn tiếp theo chứa một phao, ngoại lệ sẽ được nâng lên. Vì vậy, tôi cần phải lặp lại lần đầu tiên thông qua khung dữ liệu bằng cách sử dụng read_csv và giữ lại loại được phỏng đoán là cao nhất. Ngoài ra, đối với các loại đối tượng, tôi cần giữ lại độ dài tối đa vì chúng sẽ được lưu trữ dưới dạng các chuỗi trong bảng.

Có cách duy nhất để giữ lại thông tin này mà không cần đọc trong toàn bộ tập dữ liệu không?

Trả lời

8

Tôi không nghĩ nó sẽ trực quan, nếu không tôi sẽ không đăng câu hỏi. Nhưng một lần nữa, gấu trúc làm cho mọi thứ trở nên dễ dàng. Tuy nhiên, việc giữ câu hỏi vì thông tin này có thể hữu ích cho những người khác làm việc với dữ liệu lớn:

In [1]: chunker = pd.read_csv('DATASET.csv', chunksize=500, header=0) 

# Store the dtypes of each chunk into a list and convert it to a dataframe: 

In [2]: dtypes = pd.DataFrame([chunk.dtypes for chunk in chunker]) 

In [3]: dtypes.values[:5] 
Out[3]: 
array([[int64, int64, int64, object, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64]], dtype=object) 

# Very cool that I can take the max of these data types and it will preserve the hierarchy: 

In [4]: dtypes.max().values 
Out[4]: array([int64, int64, int64, object, int64, int64, int64, int64], dtype=object) 

# I can now store the above into a dictionary: 

types = dtypes.max().to_dict() 

# And pass it into pd.read_csv fo the second run: 

chunker = pd.read_csv('tree_prop_dset.csv', dtype=types, chunksize=500) 
+0

bạn cũng có thể sử dụng skiprows = danh sách hàng để bỏ qua và bỏ qua hàng trong 1-9 để lấy mẫu ur chỉ mỗi hàng thứ 10, sẽ nhanh hơn nhiều (và prob nhận được câu trả lời bạn muốn), tôi nghĩ bạn sẽ cần tạo ra hàng bỏ qua này – Jeff

+0

@Jeff Làm thế nào bạn sẽ nhận được điều này mà không biết tổng số hàng trong csv, mà sẽ đòi hỏi phải đọc nó tất cả trong – Luke

+3

Bạn cũng nên xem xét việc chọn các dtypes tối đa sau mỗi lần lặp đoạn, thay vì lưu trữ tất cả các dtypes và giảm ở cuối. Ví dụ: một csv có 2MM hàng và kích thước chunk là 500, sẽ dẫn đến 400.000 hàng trong khung! – jastr

Các vấn đề liên quan