翼度科技»论坛 编程开发 python 查看内容

借助Numpy,优化Pandas的条件检索代码

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
Numpy其实是最早的处理数据的Python库,它的核心ndarray对象,是一个高效的n维数组结构。
通过这个库,可以高效的完成向量和矩阵运算,由于其出色的性能,很多其他的数据分析,科学计算或者机器学习相关的Python库都或多或少的依赖于它。
Pandas就是其中之一,Pandas充分利用了NumPy的数组运算功能,使得数据处理和分析更加高效。
比如,Pandas中最重要的两个数据结构Series和DataFrame在内部就使用了NumPy的ndarray来存储数据。
在使用Pandas进行数据分析的过程中,按条件检索和过滤数据是最频繁的操作。
本文介绍两种通过结合Numpy,一方面让Pandas的检索过滤代码更加简洁易懂,另一方面还能保障检索过滤的高性能。
1. 准备数据

第一步,先准备数据,这次使用二手房交易数据,可从 https://databook.top/lianjia/nj 下载。
  1. import pandas as pd
  2. import numpy as np
  3. # 这个路径替换成自己的路径
  4. fp = r'D:\data\南京二手房交易\南京江宁区.csv'
  5. df = pd.read_csv(fp)
  6. df.head()
复制代码

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

比如,买房前我们想先分析下已有的成交信息,对于房价能有个大致的印象。
下面,按照总价和单价,先挑选总价200~300万之间,或者单价1万以下的成交信息。
符合条件返回“OK”,否则返回“NG”
  1. def filter_data(row):
  2.     if row["totalPrice"] > 200 and row["totalPrice"] < 300:
  3.         return "OK"
  4.     if row["unitPrice"] < 10000:
  5.         return "OK"
  6.     return "NG"
  7. df["评估"] = df.apply(filter_data, axis=1)
  8. df[df["评估"] == "OK"].head()
复制代码

上面的过滤数据写法是使用Pandas时用的比较多的方式,也就是将过滤条件封装到一个自定义函数(filter_data)中,然后通过 apply 函数来完成数据过滤。
下面我们用Numpy的 np.where 接口来改造上面的代码。
np.where类似Python编程语言中的if-else判断,基本语法:
  1. import numpy as np
  2. np.where(condition[, x, y])
复制代码
其中:

  • condition:条件表达式,返回布尔数组。
  • x 和 y:可选参数,condition为True,返回x,反之,返回y。
如果未提供x 和 y,则函数仅返回满足条件的元素的索引。
改造后的代码如下:
  1. # 根据单价过滤
  2. cond_unit_price = np.where(
  3.     df["unitPrice"] < 10000,
  4.     "OK",
  5.     "NG",
  6. )
  7. # 先根据总价过滤,不满足条件再用单价过滤
  8. cond_total_price = np.where(
  9.     (df["totalPrice"] > 200) & (df["totalPrice"] < 300),
  10.     "OK",
  11.     cond_unit_price,
  12. )
  13. df["评估"] = cond_total_price
  14. df[df["评估"] == "OK"].head()
复制代码
运行之后返回的结果是一样的,但是性能提升很多。
如果数据量是几十万量级的话,你会发现改造之后的代码运行效率提高了几百倍。
3. 复杂多条件判断(np.select)

上面的示例中,判断还比较简单,属于if-else,也就是是与否的判断。
下面设计一种更复杂的判断,将成交信息评估为“优良中差”4个等级,而不仅仅是“OK”“NG”
我们假设:
<ol>:房屋精装,且位于中楼层,且近地铁
:总价

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具