如何加速使用努比。哪里在大Pandas数据帧上?

2024-10-03 15:31:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我写的代码工作正常,但我有一个速度问题。。。你知道吗

一个函数(如下)被调用了近10000次,每次在我的机器上需要0.4秒以上的时间,这意味着脚本本身需要大约66分钟——太长了,不可能有用。对于Python-3.x,有没有一种更快的方法来编写类似countifs的函数?(上下文对应excel)

我有一个80万行和50列的输入,它被读入一个数据帧(df)。到目前为止一切都很好。我只对四列感兴趣:“dateA”、“dateB”、“theme”和“category”。你知道吗

我给函数一次又一次地输入单独的日期(在别处生成)——例如,在2013-01-01和2017-12-31之间('specifiedDate');这是c.2000调用函数的来源。对于每个“specifiedDate”,有五个类别(由“a”提供)将2000个调用乘以5!我正在尝试快速计算df中符合所提供条件的行数(在np.哪里())对于每个日期和类别。你知道吗

import numpy as np
import pandas as pd

def loopthroughdates(specifiedDate, a):
    df['calc'] = np.where((df['category'] == a)
                        & (df['dateA'] < specifiedDate)
                        & (df['dateB'] > specifiedDate)
                        | (df['category'] == a)
                        & (df['theme'] == "Blue")
                        & (df['dateA'] < specifiedDate),1,0)
    total = df['calc'].sum()
    return total

函数返回一个整数,该整数等于与中的条件匹配的行数np.哪里()对于每个日期和类别。此整数在脚本的其余部分中用于构建如下所示的表:

Date,cat1,cat2,cat3,cat4,cat5
2015-04-10,100,300,80,30,250
2015-04-11,101,300,70,35,248
2015-04-12,102,298,72,38,247

我已经尝试了很多方法,从这个网站上的其他问题的零碎,但找不到一个比这个更快的,我觉得一定有-你能帮忙吗?你知道吗


编辑

该函数由嵌套for循环调用:

for specifiedDate in datelist:
    for a in categorylist:
        total = loopthroughdates(specifiedDate, a)

df样本(5行),不包括无关(?)列-记住这是超过800000行和50列:

dateA,dateB,category,theme
2015-01-01,2015-05-10,cat2,blue
2015-04-11,2015-04-13,cat2,blue
2015-02-25,2015-06-01,cat5,red
2015-08-01,2015-08-15,cat1,blue
2014-10-10,2015-09-03,cat4,blue

谢谢!你知道吗


Tags: 函数脚本dffornp整数bluetheme