Numpy其实是最早的处理数据的Python库,它的核心ndarray对象,是一个高效的n维数组结构。

通过这个库,可以高效的完成向量和矩阵运算,由于其出色的性能,很多其他的数据分析,科学计算或者机器学习相关的Python库都或多或少的依赖于它。

Pandas就是其中之一,Pandas充分利用了NumPy的数组运算功能,使得数据处理和分析更加高效。
比如,Pandas中最重要的两个数据结构SeriesDataFrame在内部就使用了NumPyndarray来存储数据。

在使用Pandas进行数据分析的过程中,按条件检索和过滤数据是最频繁的操作。
本文介绍两种通过结合Numpy,一方面让Pandas的检索过滤代码更加简洁易懂,另一方面还能保障检索过滤的高性能。

1. 准备数据

第一步,先准备数据,这次使用二手房交易数据,可从 https://databook.top/lianjia/nj 下载。

import pandas as pd
import numpy as np # 这个路径替换成自己的路径
fp = r'D:\data\南京二手房交易\南京江宁区.csv' df = pd.read_csv(fp)
df.head()

2. 一般条件判断(np.where)

比如,买房前我们想先分析下已有的成交信息,对于房价能有个大致的印象。
下面,按照总价和单价,先挑选总价200~300万之间,或者单价1万以下的成交信息。
符合条件返回“OK”,否则返回“NG”

def filter_data(row):
if row["totalPrice"] > 200 and row["totalPrice"] < 300:
return "OK" if row["unitPrice"] < 10000:
return "OK" return "NG" df["评估"] = df.apply(filter_data, axis=1)
df[df["评估"] == "OK"].head()

上面的过滤数据写法是使用Pandas时用的比较多的方式,也就是将过滤条件封装到一个自定义函数(filter_data)中,然后通过 apply 函数来完成数据过滤。

下面我们用Numpynp.where 接口来改造上面的代码。
np.where类似Python编程语言中的if-else判断,基本语法:

import numpy as np

np.where(condition[, x, y])

其中:

  • condition:条件表达式,返回布尔数组。
  • x 和 y:可选参数,conditionTrue,返回x,反之,返回y

如果未提供xy,则函数仅返回满足条件的元素的索引。

改造后的代码如下:

# 根据单价过滤
cond_unit_price = np.where(
df["unitPrice"] < 10000,
"OK",
"NG",
) # 先根据总价过滤,不满足条件再用单价过滤
cond_total_price = np.where(
(df["totalPrice"] > 200) & (df["totalPrice"] < 300),
"OK",
cond_unit_price,
) df["评估"] = cond_total_price
df[df["评估"] == "OK"].head()

运行之后返回的结果是一样的,但是性能提升很多。
如果数据量是几十万量级的话,你会发现改造之后的代码运行效率提高了几百倍。

3. 复杂多条件判断(np.select)

上面的示例中,判断还比较简单,属于if-else,也就是是与否的判断。
下面设计一种更复杂的判断,将成交信息评估为“优良中差”4个等级,而不仅仅是“OK”“NG”
我们假设:

  1. :房屋精装,且位于中楼层,且近地铁
  2. :总价<300,且近地铁
  3. :总价<400
  4. :其他情况

用传统的方式,同样是封装一个类似filter_data的函数来判断“优良中差”4个等级,然后用 apply 函数来完成数据过滤。
这里就不演示了,直接看结合Numpynp.select接口,高效的完成“优良中差”4个等级的过滤。

np.select类似Python编程语言中的match匹配,基本语法:

numpy.select(condlist, choicelist, default=0)

其中:

  • condlist:条件列表,每个条件都是一个布尔数组。
  • choicelist:与 condlist 对应的数组列表,当某个条件为真时,返回该位置对应的数组中的元素。
  • default:可选参数,当没有条件为真时返回的默认值。
# 设置 “优,良,中” 的判断条件
conditions = [
df["houseInfo"].str.contains("精装")
& df["positionInfo"].str.contains("中楼层")
& df["advantage"].str.contains("近地铁"), (df["totalPrice"] < 300) & df["advantage"].str.contains("近地铁"), df["totalPrice"] < 400,
]
choices = ["优", "良", "中"] # 默认为 “差”
df["评估"] = np.select(conditions, choices, default="差")
df.head()


这样,就实现了一个对成交信息的分类。

4. 总结

np.wherenp.select的底层都是向量化的方式来操作数据,执行效率非常高。

所以,我们在使用Pandas分析数据时,应尽量使用np.wherenp.select来帮助我们过滤数据,这样不仅能够让代码更加简洁专业,而且能够极大的提高分析性能。

借助Numpy,优化Pandas的条件检索代码的更多相关文章

  1. numpy、pandas

    numpy: 仨属性:ndim-维度个数:shape-维度大小:dtype-数据类型. numpy和pandas各def的axis缺省为0,作用于列,除DataFrame的.sort_index()和 ...

  2. NumPy和Pandas常用库

    NumPy和Pandas常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数 ...

  3. python安装numpy和pandas

    最近要对一系列数据做同比比较,需要用到numpy和pandas来计算,不过使用python安装numpy和pandas因为linux环境没有外网遇到了很多问题就记下来了.首要条件,python版本必须 ...

  4. 如何快速地从mongo中提取数据到numpy以及pandas中去

    mongo数据通常过于庞大,很难一下子放进内存里进行分析,如果直接在python里使用字典来存贮每一个文档,使用list来存储数据的话,将很快是内存沾满.型号拥有numpy和pandas import ...

  5. [转] python安装numpy和pandas

    最近要对一系列数据做同比比较,需要用到numpy和pandas来计算,不过使用python安装numpy和pandas因为linux环境没有外网遇到了很多问题就记下来了.首要条件,python版本必须 ...

  6. Python 工匠:编写条件分支代码的技巧

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 作者:朱雷 | 腾讯IEG高级工程师 『Python 工匠』是什么? 我一直觉得编程某种意义是一门『手艺』 ...

  7. numpy和pandas简单使用

    numpy和pandas简单使用 import numpy as np import pandas as pd 一维数据分析 numpy中使用array, pandas中使用series numpy一 ...

  8. Python入门之安装numpy和pandas

    最近要对一系列数据做同比比较,需要用到numpy和pandas来计算,不过使用python安装numpy和pandas因为linux环境没有外网遇到了很多问题就记下来了. 首要条件,python版本必 ...

  9. asp.net用三层实现多条件检索

    众所周知,三层将项目分为界面层,业务逻辑层和数据訪问层(以最主要的三层为例) 相同都知道,多条件检索事实上就是依据用户选择的条件项,然后来拼sql语句 那么.既然要依据用户选择的条件项来拼sql语句, ...

  10. 【转载】python安装numpy和pandas

    转载:原文地址 http://www.cnblogs.com/lxmhhy/p/6029465.html 最近要对一系列数据做同比比较,需要用到numpy和pandas来计算,不过使用python安装 ...

随机推荐

  1. 【React】排查两小时,修改一个词,记一个因代码书写不规范导致的生命周期BUG

    壹 ❀ 引 因为现在工作主要以修bug为主,日常工作中总是会接触到千奇百怪的前端问题,它可能是代码缺陷导致的程序错误,也可能是方案不合理造成的性能问题,老实说修bug是一件很枯燥的事情,你需要阅读大量 ...

  2. C# 12 中新增的八大功能你都知道吗?

    前言 转眼之间C#都已经更新到了12了,那么C# 12 中新增的八大功能你都了解过吗?今天我们来简单介绍一下C# 12 中新增的八大功能. C#/.NET该如何自学入门?:https://www.cn ...

  3. 解决Springboot发起https请求报错:sun.sec urity.validator.ValidatorException: PKIX path building failed

    问题描述 最近开发项目中在springboot接口中调用第三方https接口,后台日志报错: sun.sec urity.validator.ValidatorException: PKIX path ...

  4. Vuepress + GitHub Actions实现文档博客自动部署

    说明 接着我上一篇文章,已经使用vuepress+github pages搭建好了自己的文档博客,并且可以在本地打包上传后就可以在pages上查看更新内容.但是有1个比较明显的缺点:打包速度并不快!! ...

  5. 阿里面试:Java开发中,应如何避免OOM

    Java内存管理:避免OOM的10个实用小技巧 引言 在Java开发中,OutOfMemoryError(OOM)错误一直是令开发者头疼的问题,也是Java面试中出现核心频率很高的问题. 那么我们究竟 ...

  6. gitee配置SSH公钥

    第一步,找个地方打开"git bash",然后输入生成ssh公钥的命令: ssh-keygen -t rsa -C 'your-email' 然后敲四次回车生成公钥: 第二步,输入 ...

  7. Qt开发技术:QCharts(四)QChart面积图介绍、Demo以及代码详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  8. rename重命名

    [root@liuwei test]# ls 11.txt 12.txt 13.txt 14.txt 15.txt 16.txt 17.txt 18.txt 19.txt 1.txt 20.txt 2 ...

  9. 【Python语法糖】闭包和装饰器

    Python闭包和装饰器 参考: https://zhuanlan.zhihu.com/p/453787908 https://www.bilibili.com/video/BV1JW411i7HR/ ...

  10. 【Azure Redis 缓存】Azure Cache for Redis 如何迁移

    Azure Cache for Redis 如何迁移 [Azure Redis 缓存]Azure Cache for Redis有默认备份可以用于恢复么?一文中,介绍了使用RDB文件的方式来迁移Red ...