繁体   English   中英

通过300万个熊猫数据框行有效处理

[英]Efficiently process through 3 millions Pandas dataframe rows

我需要处理具有300万行和7列的大型csv文件。 DataFrame的形状:(3421083,7)

我的计划是删除所有包含特定值(客户ID)的行,这是我的处理方式:

#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的RAM。 但是在活动监视器中,计算机仅使用5 GB的RAM和40%的CPU。

有什么方法可以加快此过程的计算速度吗? 通过更改代码还是使用其他库?

我也有一个GPU(gtx 970),可以用它来处理吗?

谢谢。

使用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])]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM