iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >怎么避免编写pandas代码
  • 804
分享到

怎么避免编写pandas代码

2024-04-02 19:04:59 804人浏览 安东尼
摘要

本篇内容主要讲解“怎么避免编写pandas代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么避免编写pandas代码”吧!设置from platf

本篇内容主要讲解“怎么避免编写pandas代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么避免编写pandas代码”吧!

设置

from platfORM importpython_versionimport numpy as np import pandas as pdnp.random.seed(42) # set the seed tomake examples repeatable

样本数据集

样本数据集包含各个城市的预订信息,是随机的,唯一目的是展示样本。

数据集有三列:

  • id表示唯一的标识

  • city表示预定的城市信息

  • booked perc表示特定时间预定的百分比

数据集有一万条,这使速度改进更加明显。注意,如果代码以正确的pandas方式编写,pandas可以利用DataFrames计算数百万(甚至数十亿)行的统计数据。

size = 10000cities =["paris", "barcelona", "berlin", "newyork"]df = pd.DataFrame(     {"city": np.random.choice(cities,sizesize=size), "booked_perc": np.random.rand(size)} ) df["id"] = df.index.map(str) +"-" + df.city dfdf = df[["id", "city", "booked_perc"]] df.head()

怎么避免编写pandas代码

1. 如何避免对数据求和

来自Java世界的灵感,把“多行for循环”应用到了Python

计算booked perc列的总和,把百分比加起来毫无意义,但无论如何,一起来试试吧,实践出真知。

%%timeitsuma = 0 for _, row in df.iterrows():     suma += row.booked_perc766ms ± 20.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

更符合Python风格的方式来对列求和如下:

%%timeitsum(booked_perc forbooked_perc in df.booked_perc)989 µs ± 18.5 µs per loop (mean ±std. dev. of 7 runs, 1000 loops each)%%timeitdf.booked_perc.sum()92µs ± 2.21 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

正如预期的那样,第一个示例是最慢的——对一万项求和几乎需要1秒。第二个例子的速度之快令人惊讶。

正确的方法是使用pandas对数据进行求和(或对列使用任何其他操作),这是第三个示例——也是最快的!

2. 如何避免过滤数据

尽管在使用pandas之前,笔者已经很熟悉numpy,并使用for循环来过滤数据。求和时,还是可以观察到性能上的差异。

%%timeitsuma = 0 for _, row in df.iterrows():     if row.booked_perc <=0.5:         suma += row.booked_perc831ms &plusmn; 25.7 ms per loop (mean &plusmn; std. dev. of 7 runs, 1 loop each)%%timeitdf[df.booked_perc<= 0.5].booked_perc.sum()724 &micro;s &plusmn; 18.8 &micro;s per loop(mean &plusmn; std. dev. of 7 runs, 1000 loops each)

正如预期的一样,第二个例子比第一个例子快很多

如果加入更多的过滤器呢?只需把它们添加到括号里:

%%timeitdf[(df.booked_perc <=0.5) & (df.city == 'new york')].booked_perc.sum()1.55ms &plusmn; 10.7 &micro;s per loop (mean &plusmn; std. dev. of 7 runs, 1000 loops each)

3. 如何避免访问以前的值

你可能会说:好吧,但是如果需要访问先前某一列的值呢,还是需要一个for循环。你错了!

分别使用和不使用for循环来计算一行到另一行百分数的改变

%%timeitfor i inrange(1, len(df)):     df.loc[i,"perc_change"] =  (df.loc[i].booked_perc- df.loc[i - 1].booked_perc) / df.loc[i- 1].booked_perc7.02 s &plusmn; 24.4 ms per loop (mean &plusmn; std. dev. of 7runs, 1 loop each)%%timeitdf["perc_change"] = df.booked_perc.pct_change()586&micro;s &plusmn; 17.3 &micro;s per loop (mean &plusmn; std. dev. of 7 runs, 1000 loops each)

同样,第二个例子比第一个使用for循环的例子快得多。

pandas有许多函数可以根据以前的值计算统计数据(例如shift函数对值进行移位)。这些函数接受periods参数,可以在计算中包含以前值的数量。

4. 如何避免使用复杂的函数

有时需要在DataFrame中使用复杂函数(有多个变量的函数)。让我们将从纽约的booking_perc两两相乘,其他设置为0并且把这列命名为sales_factor。

笔者首先想到的是使用iterrows的for循环。

%%timeitfor i, row in df.iterrows():     if row.city =='new york':         df.loc[i, 'sales_factor'] =row.booked_perc * 2     else:         df.loc[i, 'sales_factor'] =03.58 s &plusmn; 48.2 ms per loop (mean &plusmn; std. dev. of 7 runs, 1 loop each)

一个更好的办法是直接在DataFrame上使用函数。

%%timeitdef calculate_sales_factor(row):     if row.city =='new york':         return row.booked_perc* 2     return 0df['sales_factor'] =df.apply(calculate_sales_factor, axis=1)165 ms &plusmn; 2.48 ms per loop(mean &plusmn; std. dev. of 7 runs, 10 loops each)

最快的方法是使用pandas过滤器直接计算函数值。

%%timeit df.loc[df.city== 'new york', 'sales_factor'] = df[df.city == 'newyork'].booked_perc * 2 df.sales_factor.fillna(0, inplace=True)3.03 ms &plusmn; 85.5 &micro;sper loop (mean &plusmn; std. dev. of 7 runs, 100 loops each)

可以看到从第一个例子到最后一个的加速过程。

当解决有3个及3个以上变量的函数时,可以把它分解为多个pandas表达式。这比运用函数更快。

Eg: f(x, a, b) = (a + b) * x df['a_plus_b'] = df['a'] +df['b'] df['f'] = df['a_plus_b'] * df['x']

5. 如何避免对数据进行分组

现在可以看到,在开始使用pandas之前,笔者更多依赖于for循环。至于对数据进行分组,如果充分发挥pandas的优势,可以减少代码行数。

要计算如下数据:

  • 一个城市的平均sales factor

  • 一个城市的首次预定id

%%timeit avg_by_city = {} count_by_city = {} first_booking_by_city = {}for i, row in df.iterrows():     city = row.city     if city in avg_by_city:         avg_by_city[city] += row.sales_factor         count_by_city[city] += 1     else:         avg_by_city[city] = row.sales_factor         count_by_city[city] = 1         first_booking_by_city[city] =row['id']for city, _ in avg_by_city.items():     avg_by_city[city] /=count_by_city[city]878 ms &plusmn; 21.4 ms per loop (mean &plusmn; std. dev. of 7 runs, 1 loopeach)

Pandas有分组操作所以不必在DataFrame上进行迭代,pandas的分组操作和sql的GROUP BY语句一样的。

%%timeitdf.groupby('city').sales_factor.mean() df.groupby('city').sales_factor.count() df.groupby('city').id.first()3.05 ms &plusmn; 65.3 &micro;s per loop(mean &plusmn; std. dev. of 7 runs, 100 loops each)%%timeitdf.groupby("city").agg({"sales_factor":["mean", "count"], "id": "first"})4.5ms &plusmn; 131 &micro;s per loop (mean &plusmn; std. dev. of 7 runs, 100 loops each)

到此,相信大家对“怎么避免编写pandas代码”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么避免编写pandas代码

本文链接: https://www.lsjlt.com/news/85238.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么避免编写pandas代码
    本篇内容主要讲解“怎么避免编写pandas代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么避免编写pandas代码”吧!设置from platf...
    99+
    2024-04-02
  • JavaScript中怎样避免编写不良代码
    这期内容当中小编将会给大家带来有关JavaScript中怎样避免编写不良代码,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具有不同接口的替代类由于重复,两个功能相同但接口...
    99+
    2024-04-02
  • 怎么避免CSS编写错误
    本篇内容介绍了“怎么避免CSS编写错误”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正如我们今天所知,CS...
    99+
    2024-04-02
  • Pandas加速代码之避免使用for循环
    前言 使用Pandas dataframe执行数千甚至数百万次计算仍然是一项挑战。你不能简单的将数据丢进去,编写Python for循环,然后希望在合理的时间内处理数据。 Panda...
    99+
    2024-04-02
  • 怎么避免在Java代码中写大量的判空语句
    这篇文章主要介绍了怎么避免在Java代码中写大量的判空语句的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么避免在Java代码中写大量的判空语句文章都会有所收获,下面我们一起来看看吧。有人说可以使用 JDK8提...
    99+
    2023-06-27
  • pycharm怎么编写代码
    如何使用 pycharm 编写代码?创建新项目并文件,在代码编辑器中编写代码。使用代码提示和自动完成功能,提高编写效率。通过运行代码验证其功能。设置断点并使用调试工具进行代码调试。集成版...
    99+
    2024-04-18
    linux python git pycharm
  • Java中避免写嵌套if样式的代码详解
    前言Optional的代码相对更加简洁,当代码量较大时,我们很容易忘记进行null判定,但是使用Optional类则会避免这类问题。下面这是一个嵌套的 if 判断,业务逻辑是从 httpRequst 中获取 X-Auth-Token 的值。...
    99+
    2023-05-31
    java if嵌套 ava
  • JavaScript避免嵌套代码浅析
    目录前言一、何为嵌套代码二、避免嵌套1.提炼抽取2.反转排列前言 看过不少过度嵌套的代码, 我真正意识到问题的严重性是刚入职那会, 我在一个老项目里看到了40个连续的else if,...
    99+
    2023-02-22
    JS避免嵌套代码 JS嵌套代码 JS代码不嵌套
  • JavaScript如何避免嵌套代码
    本篇内容介绍了“JavaScript如何避免嵌套代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、何为嵌套代码嵌套代码是在函数内部添加更...
    99+
    2023-07-05
  • Pygame实现小球躲避实例代码怎么写
    Pygame实现小球躲避实例代码怎么写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前言:这学期的Python课,要写代码是真的多…课程实验一是一个五子棋,但是发了代码。至于代...
    99+
    2023-06-22
  • 编写PHP代码
    编写PHP代码 一、什么是PHP 1.1 php简介 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言,其可在服务器上执行。PH...
    99+
    2023-09-02
    php 学习
  • python爱心代码编程怎么写
    步骤为:1、确定爱心的样式和大小。在纸上画出你想要的爱心形状,然后将其转化为字符打印的方式;2、创建一个列表,用来存储爱心的每一行字符;3、根据爱心的形状,将每一行的字符添加到列表中。可以使用空格、星号等字符来表示爱心的形状;4、使用循环遍...
    99+
    2023-11-20
    python 代码编程
  • 怎么编写更好的JS代码
    这篇文章主要介绍“怎么编写更好的JS代码”,在日常操作中,相信很多人在怎么编写更好的JS代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么编写更好的JS代码”的疑惑有所帮...
    99+
    2024-04-02
  • 怎么编写高效的TS代码
    这篇文章主要介绍“怎么编写高效的TS代码”,在日常操作中,相信很多人在怎么编写高效的TS代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么编写高效的TS代码”的疑惑有所帮...
    99+
    2024-04-02
  • 怎么编写更好的React代码
    这篇文章主要介绍“怎么编写更好的React代码”,在日常操作中,相信很多人在怎么编写更好的React代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么编写更好的React...
    99+
    2024-04-02
  • 避免在 Go 中编写过多的 getter 和 setter
    编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天编程网就整理分享《避免在 Go 中编写过多的 ge...
    99+
    2024-04-05
  • 怎么编写可维护的JavaScript代码
    这篇文章主要为大家展示了“怎么编写可维护的JavaScript代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么编写可维护的JavaScript代码”这篇文...
    99+
    2024-04-02
  • 怎么编写高性能的JavaScript代码
    这篇文章主要介绍“怎么编写高性能的JavaScript代码”,在日常操作中,相信很多人在怎么编写高性能的JavaScript代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • python代码爱心怎么编写简单
    可以使用 python 的 matplotlib 库绘制爱心。首先,导入 matplotlib.pyplot 并定义 x 和 y 坐标,使用参数方程生成爱心形状。然后,使用 plt.pl...
    99+
    2024-04-02
  • Nginx+uwsgi+Django部署代码怎么编写
    Nginx+uwsgi+Django部署代码怎么编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Nginx+uwsgi+Django部署代码安装uwsgi1....
    99+
    2023-06-04
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作