Skip to main content
 首页 » 编程设计

python之高效处理 300 万个 Pandas 数据框行

2025年05月04日26小虾米

我需要处理一个包含 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。但是在事件监视器中,计算机只使用了 5 gbs 的内存和 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])]