【问题标题】:Efficiently process through 3 millions Pandas dataframe rows高效处理 300 万个 Pandas 数据帧行
【发布时间】:2023-03-04 16:59:01
【问题描述】:

我需要处理一个包含 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 小时以来,此操作需要很长时间才能运行,但仍未完成。

我有一个 3.2 ghz 和 8GB 内存的四核台式机 i5。但是在活动监视器中,计算机只使用了 5 GB 的内存和 40% 的 CPU。

有什么方法可以加快这个过程的计算速度?通过更改代码或使用其他库?

我还有一个 gpu (gtx 970) 我可以用它来处理这个吗?

谢谢。

【问题讨论】:

  • 您有超过 300 万条记录,您的代码是 accidentally quadratic。糟糕的组合。
  • 我什至不确定您为什么要为此使用熊猫。只需流式传输 csv。

标签: python csv pandas optimization dataframe


【解决方案1】:

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

【讨论】:

  • 除非您将assume_unique 指定给 np.in1d,否则我认为它无论如何都有自己的独特性。所以不妨直接传递用户,恕我直言。
  • @DSM 谢谢,我绝对想要assume_unique=True,因为我正在利用pd.unique 不排序的事实。我还没有测试过这是否有区别。但这就是思考过程。
  • 我不确定这是否可行。 assume_unique 意味着我们假设 both 都是独一无二的,我想。我只是放弃 pd.unique 并让 np.in1d 自己完成工作。
  • np.in1d 的文档说明 assume_unique=True 意味着 both 输入数组是唯一的。另外请注意,如果输入数据为large enoughisin 将在后台使用np.in1d
  • 请注意,isin 将使用 np.in1d 进行非常大的输入(它是一种经验性性能优化)
猜你喜欢
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多