python apply函数为什么快_python – Pandas – 关于apply函数缓慢的解释-程序员宅基地

技术标签: python apply函数为什么快  

对于大型数据帧(约1~3百万行),应用函数似乎工作得非常慢.

对于我的情况,我有两种与apply函数有关的任务.

第一:应用查找字典查询

f(p_id, p_dict):

return p_dict[p_dict['ID'] == p_id]['value']

p_dict = DataFrame(...) # it's another dict works like lookup table

df = df.apply(f, args=(p_dict,))

第二:适用于groupby

f(week_id, min_week_num, p_dict):

return p_dict[(week_id - min_week_num < p_dict['WEEK']) & (p_dict['WEEK'] < week_id)].ix[:,2].mean()

f_partial = partial(f, min_week_num=min_week_num, p_dict=p_dict)

df = map(f, df['WEEK'])

我想对于第一种情况,它可以通过数据帧连接完成,而我不确定这种连接在大型数据集上的资源成本.

我的问题是:

>在上述两种情况下,有没有办法替代申请?

>为什么适用这么慢?对于dict查找案例,我认为它应该是O(N),即使N是100万,也不应该花费那么多.

解决方法:

关于你的第一个问题,我不能确切地说为什么这个例子很慢.但通常,apply不会利用矢量化.此外,apply返回一个新的Series或DataFrame对象,因此对于一个非常大的DataFrame,你有相当大的IO开销(我无法保证在Pandas有大量内部实现优化的情况下,这种情况是100%的情况).

对于您的第一种方法,我假设您尝试使用p_dict作为查找表填充df中的“值”列.使用pd.merge快大约1000倍:

import string, sys

import numpy as np

import pandas as pd

##

# Part 1 - filling a column by a lookup table

##

def f1(col, p_dict):

return [p_dict[p_dict['ID'] == s]['value'].values[0] for s in col]

# Testing

n_size = 1000

np.random.seed(997)

p_dict = pd.DataFrame({'ID': [s for s in string.ascii_uppercase], 'value': np.random.randint(0,n_size, 26)})

df = pd.DataFrame({'p_id': [string.ascii_uppercase[i] for i in np.random.randint(0,26, n_size)]})

# Apply the f1 method as posted

%timeit -n1 -r5 temp = df.apply(f1, args=(p_dict,))

>>> 1 loops, best of 5: 832 ms per loop

# Using merge

np.random.seed(997)

df = pd.DataFrame({'p_id': [string.ascii_uppercase[i] for i in np.random.randint(0,26, n_size)]})

%timeit -n1 -r5 temp = pd.merge(df, p_dict, how='inner', left_on='p_id', right_on='ID', copy=False)

>>> 1000 loops, best of 5: 826 µs per loop

关于第二个任务,我们可以快速向p_dict添加一个新列,它计算时间窗口从min_week_num开始的平均值,并在p_dict中该行的一周结束.这要求p_dict按WEEK列的升序排序.然后你可以再次使用pd.merge.

我假设min_week_num在以下示例中为0.但您可以轻松修改rolling_growing_mean以获取不同的值. rolling_growing_mean方法将在O(n)中运行,因为它每次迭代执行固定数量的操作.

n_size = 1000

np.random.seed(997)

p_dict = pd.DataFrame({'WEEK': range(52), 'value': np.random.randint(0, 1000, 52)})

df = pd.DataFrame({'WEEK': np.random.randint(0, 52, n_size)})

def rolling_growing_mean(values):

out = np.empty(len(values))

out[0] = values[0]

# Time window for taking mean grows each step

for i, v in enumerate(values[1:]):

out[i+1] = np.true_divide(out[i]*(i+1) + v, i+2)

return out

p_dict['Means'] = rolling_growing_mean(p_dict['value'])

df_merged = pd.merge(df, p_dict, how='inner', left_on='WEEK', right_on='WEEK')

标签:python,pandas

来源: https://codeday.me/bug/20190925/1815979.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39620001/article/details/111863136

智能推荐

PR安装详细讲解_cnsdn pr安装-程序员宅基地

文章浏览阅读3.5k次,点赞4次,收藏16次。下载PR之后解压压缩包,如下图:双击打开解压后的文件夹 “PR CC2015” 双击 “set-up” ,如下图:在 “遇到了以下问题” 界面中选择 “忽略”,如下图:接着选择 “试用” ,如下图:没有ID号的就直接选择 “获得ID号”(是免费的),如果之前已经有注册过就输入ID和密码即可,如下图:之后选择安装的路径(建议不要装在系统盘即C盘中),如下图:耐心等待安装,如下图:此时界面中会提示是 “PR CC2015的试用版”,我们不选择 “开始使用”(如果选了也没事 ,关闭_cnsdn pr安装

VS2013 64位 32位|Microsoft Visual Studio Ultimate 2013(简体中文旗舰版)_visual studio 2013有没有64位-程序员宅基地

文章浏览阅读1.8w次,点赞3次,收藏10次。首先说明:Visual Studio 没有64位微软说,的确有无数的开发者提议微软开发64bit的Visual Studio,但是微软没有这么做,是因为微软调查了绝大多数的深层需求,他们之所以期待64bit的Visual Studio,是因为他们认为64bit的程序可能拥有更高的性能。但是实际上不是这么回事,64bit程序在x86-64处理器上并不会带来明显的性能提高,它只是增加了处理器的_visual studio 2013有没有64位

在与SQL Server建立连接时出现与网络相关的或特定于实例的错误_在与 sql server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访-程序员宅基地

文章浏览阅读10w+次,点赞41次,收藏98次。分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; _在与 sql server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访

Mac上程序员必备的工具-程序员宅基地

文章浏览阅读290次。工欲善其事,必先利其器」,颜值高且好用的工具往往能让我们事半功倍。对程序员来说,Mac拥有着高分辨率、超好用的Touch Bar和MacOS系统,我用Mac也好多年了,现在分享下Mac上好用的工具,让你快乐的编程和提升工作效率。

LeetCode.213.打家劫舍II_python leetcode 213 打家劫舍ii-程序员宅基地

文章浏览阅读127次。原题链接:https://leetcode-cn.com/problems/house-robber-ii/根据官方给出的提示:因为房间n和房间1是相邻的,所以不能同时抢房间1和房间n。所以问题就变成了是抢劫House[1]~House[n-1]还是抢House[2]~House[n],会获取更大的利润。因为打家劫舍问题已经被解决。class Solution(object): de..._python leetcode 213 打家劫舍ii

[置顶] QEE2.1 色色修改版 -- web构建工具集成色色qsedb库,支持class 2 sql-程序员宅基地

文章浏览阅读517次。集成 SQL table 类封装器 XTable http://qeephp.com/bbs/viewthread.php?tid=10744&extra= 我发的帖子及下载资源如下: 关于 之前的改进见:QEE2.1 色色修改版 -- 多级控制器目录与控制器创建支持模块@http://qeephp.com/bbs/thread-10564-1-4.html#新的改进

随便推点

C语言实现memcpy_实现带异常处理的memcpy-程序员宅基地

文章浏览阅读141次。#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>void* Mymemcpy(void* dest,const void* src,size_t num) { if (dest == NULL || src == NULL) { return NULL; } //将vo..._实现带异常处理的memcpy

结构体赋值(scanf)_结构体用scanf赋值-程序员宅基地

文章浏览阅读9.2k次,点赞7次,收藏20次。#includeint main(void){struct abc { char name; int a; float b; };struct abc stu[3];int i;printf("please input:\n");for(i=0;i scanf(" %c %d %f",&stu[_结构体用scanf赋值

Odoo12中性能检测装饰器@profile用法示例_odoo profile-程序员宅基地

文章浏览阅读1.3k次。Odoo12中性能检测装饰器@profile用法示例Odoo12中源码关于profile.py的代码如下:注: 源代码位置在…\odoo\odoo\odoo\tools\profiler.py ,这里不对不对源码进行展示,这里仅对方法介绍及参数部分进行解释@profile装饰器的参数如下: def profile(method=None, whitelist=None, blacklist..._odoo profile

通讯软件005——分分钟学Modbus Slave_modbus slave软件-程序员宅基地

文章浏览阅读654次。快速使用Modbus Slave_modbus slave软件

TF-A分配堆栈空间详解(TF-A入口分析三)_tf-a 加载地址 入口地址-程序员宅基地

文章浏览阅读618次。在多核处理器环境中,每个CPU核心都需要获得独立的栈空间,从而在并行运行时避免栈空间冲突和竞争。为每个cpu分配堆栈空间仍是由TF-A中入口函数的第一个宏`el3_entrypoint_common`完成的,分配堆栈空间除了设置栈的起始地址和大小,还将栈指针sp(Stack Pointer)寄存器设置为指向该栈的顶部。本文详细地分析了TF-A分配堆栈空间的过程。_tf-a 加载地址 入口地址

Linux配置环境变量_vim /etc/environment-程序员宅基地

文章浏览阅读6.2k次,点赞7次,收藏47次。在配置 Linux 系统服务器的时候,我们常常需要设置系统环境变量,这篇文章就是总结几种常见的配置环境变量的方式。_vim /etc/environment

推荐文章

热门文章

相关标签