我写的代码工作正常,但我有速度问题......
一个函数(下面)被称为近10000次,每次在我的机器上需要0.4 +秒,这意味着脚本本身需要大约66分钟 - 太长而无法使用。是否有一种明显更快的方式来写这个' countifs'喜欢Python-3.x的功能? (excel等效,用于上下文)
我有一个c.800 000行和50列的输入,这被读入一个pandas数据帧(df)。到目前为止一切顺利。我只对四个栏目感兴趣:' dateA',' dateB','主题'和'类别'。
我一次又一次地为函数提供个别日期(在别处生成) - 例如,在2013-01-01和2017-12-31之间(' specifiedDate');这是函数c.2000调用的来源。对于每个指定的日期'有五个类别(由' a'提供)将2000个电话乘以5!我试图快速计算df中与每个日期和类别的提供标准(在np.where()中)匹配的行数。
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.where()中与每个日期和类别的条件匹配的行数。在整个脚本的其余部分中使用此整数来构建一个如下所示的表:
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行)样本 - 记住这是超过80万行和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
谢谢!