2017-12-05 72 views
5

Tôi đang cố hợp nhất hai khung dữ liệu trong gấu trúc, sử dụng read_csv. Nhưng một trong các khung dữ liệu của tôi (trong ví dụ này là d1) quá lớn đối với máy tính của tôi để xử lý, vì vậy tôi đang sử dụng đối số iterator trong read_csv.Kết hợp các khung dữ liệu lặp lại với gấu trúc

Hãy nói rằng tôi có hai dataframes

d1 = pd.DataFrame({ 
    "col1":[1,2,3,4,5,6,7,8,9], 
    "col2": [5,4,3,2,5,43,2,5,6], 
    "col3": [10,10,10,10,10,4,10,10,10]}, 
    index=["paul", "peter", "lauren", "dave", "bill", "steve", "old-man", "bob", "tim"]) 

d2 = pd.DataFrame({ 
    "yes/no": [1,0,1,0,1,1,1,0,0]}, 
    index=["paul", "peter", "lauren", "dave", "bill", "steve", "old-man", "bob", "tim"]) 

tôi cần phải hợp nhất chúng lại để mỗi hàng chụp toàn bộ dữ liệu cho mỗi người, vì vậy tương đương với việc thực hiện:

pd.concat((d1,d2), axis=1,join="outer") 

nhưng kể từ khi tôi có thể không phù hợp với bộ nhớ, tôi đã sử dụng read_csv (Tôi đang sử dụng read_csv vì tôi đã xử lý một tệp lớn và lưu nó thành định dạng .csv, vì vậy hãy tưởng tượng dataframe d1 của tôi được chứa trong tệp test.csv).

itera = pd.read_csv("test.csv",index_col="index",iterator=True,chunksize=2) 

Nhưng khi tôi làm

for i in itera: 
    d2 = pd.concat((d2,i), axis=1,join="outer") 

đầu ra của tôi là dataframe đầu tiên nối bởi dataframe thứ hai.

đầu ra của tôi trông như thế này:

 col1 col2 col3 yes/no 
one  NaN NaN NaN  1.0 
two  NaN NaN NaN  0.0 
three NaN NaN NaN  1.0 
four NaN NaN NaN  0.0 
five NaN NaN NaN  1.0 
six  NaN NaN NaN  1.0 
seven NaN NaN NaN  1.0 
eight NaN NaN NaN  0.0 
nine NaN NaN NaN  0.0 
one  1.0 5.0 10.0  NaN 
two  2.0 4.0 10.0  NaN 
three 3.0 3.0 10.0  NaN 
four 4.0 2.0 10.0  NaN 
five 5.0 5.0 10.0  NaN 
six  6.0 43.0 4.0  NaN 
seven 7.0 2.0 10.0  NaN 
eight 8.0 5.0 10.0  NaN 
nine 9.0 6.0 10.0  NaN 

Hy vọng câu hỏi của tôi có ý nghĩa :)

+1

câu trả lời nhanh: cố gắng sử dụng thư viện Dask, nó có thể xử lý dataframes lớn mà không thể phù hợp với bộ nhớ: http://dask.pydata.org/en/latest/ – CrazyElf

+1

* đầu ra của tôi là dataframe đầu tiên được nối thêm bởi khung dữ liệu thứ hai * ... bạn muốn gì? – Parfait

+0

Hãy thử một concat lồng nhau: 'pd.concat ([d1, pd.concat (itera, ignore_index = True)])' – Parfait

Trả lời

1

Tôi nghĩ rằng bạn đang tìm kiếm combine first phương pháp. Về cơ bản, nó cập nhật df1 với các giá trị từ mỗi đoạn trong trình lặp vòng read_csv.

import pandas as pd 
from StringIO import StringIO 

d1 = pd.DataFrame({ 
    "col1":[1,2,3,4,5,6,7,8,9], 
    "col2": [5,4,3,2,5,43,2,5,6], 
    "col3": [10,10,10,10,10,4,10,10,10]}, 
    index=["paul", "peter", "lauren", "dave", "bill", "steve", "old-man", "bob", "tim"]) 


#d2 converted to string tho use with pd.read_csv 
d2 = StringIO("""y/n col5 
paul 1 
peter 0 
lauren 1 
dave 0 
bill 1 
steve 1 
old-man 1 
bob 0 
tim 0 
""") 

#For each chunk update d1 with data 
for chunk in pd.read_csv(d2, sep = ' ',iterator=True,chunksize=1): 
    d1 = d1.combine_first(chunk[['y/n']]) 
#Number formatting 
d1['y/n'] = d1['y/n'].astype(int) 

nào trả d1 trông như:

  col1 col2 col3 y/n 
bill  5  5 10 1 
bob   8  5 10 0 
dave  4  2 10 0 
lauren  3  3 10 1 
old-man  7  2 10 1 
paul  1  5 10 1 
peter  2  4 10 0 
steve  6 43  4 1 
tim   9  6 10 0 
+0

Đánh dấu là câu trả lời, vì nó mang lại cho tôi đầu ra mà tôi đã yêu cầu. Nhưng khi tôi thử nó ở mức độ lớn thì việc kết hợp hai bộ dữ liệu đó làm cho d2 của tôi trở thành ít nhất một bậc độ lớn (Nó có vẻ như nó lớn gấp hai lần, trừ đi các giá trị mà nó có thể tìm thấy trong đoạn, mỗi lặp lại). Vì vậy, mặc dù nó không phải là những gì tôi muốn, đó là những gì tôi yêu cầu; cảm ơn, tôi đoán tôi gần hơn một chút với mục tiêu của tôi bây giờ. –

+0

'd1' lớn hơn' d2'? Lần trước tôi đọc câu hỏi của bạn, tôi nghĩ ngược lại. – dubbbdan

+0

OK, tôi vừa làm rõ bài đăng để tham khảo trong tương lai; nhưng đúng vậy. –

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