2017-06-12 101 views
1

我需要處理一個包含300萬行和7列的大型csv文件。 形狀數據框的:(3421083,7)高效處理3百萬熊貓數據幀行

我的計劃是刪除包含一定值(客戶)的所有行這是我如何着手:

#keep track of iterations 
track = 0 

#import all transactions (orders.csv) 
transactions = pd.read_csv('transactions.csv') 

#We select all orders that are electronics orders and put them into a df 
is_electronics = transactions[transactions.type == "electronics"]   

#Create arrays that will store users to destroy in transactions.csv 
users_to_remove = [] 

#iterate to add appropriate values: 

# we add all users that ordered electronics to a list 
for user in is_electronics.user_id: 
    users_to_remove.append(user) 


#We delete from orders.csv 
for user in users_to_remove: 
    transactions = transactions[transactions.user_id != user] 
    track += 1 
    if track == 100000: 
     print(track) 
     track = 0 

transactions.to_csv('not_electronics.csv', index = False) 

此操作需要年齡進出口運行它自1小時後,它仍然沒有完成。

我有一個四核心桌面i5與3.2 ghz和8GB的內存。但在活動監視器中,計算機只使用5克ram和40%的cpu。

有什麼辦法可以加速這個過程的計算嗎?通過更改代碼或使用其他庫?

我也有一個gpu(gtx 970)我可以用它來處理這個嗎?

謝謝。

+4

你有超過3百萬條目,並且你的代碼是[偶然二次](http://accidentallyquadratic.tumblr.com/)。糟糕的組合。 –

+1

我甚至不確定你爲什麼要使用這個熊貓。只需流式傳輸csv。 –

回答

5

使用isin

is_electronics = transactions.type == 'electronics' 
users_to_remove = transactions.loc[is_electronics, 'user_id'].unique() 
transactions[~transactions.user_id.isin(users_to_remove)] 

刪除此前建議,在這裏是安全的


對於後人,這是@ DSM的建議

is_electronics = transactions.type.values == 'electronics' 
users = transactions.user_id.values 
transactions[~np.in1d(users, users[is_electronics])] 
+2

除非你給np.in1d指定'assume_unique',否則我認爲它無論如何都會有自己的獨特性。所以不妨直接通過用戶,恕我直言。 – DSM

+0

@DSM謝謝,我確實希望'assume_unique = True',因爲我利用了'pd.unique'不排序的事實。我沒有測試過,看看是否有所作爲。但那是思考過程。 – piRSquared

+2

我不確定這會起作用。我認爲,assume_unique意味着我們假設_both_是唯一的。我只是放棄pd.unique並讓np.in1d自己完成工作。 – DSM