Pandas管理和操作数据比SQL更方便

本文将比较Pandas和SQL在管理和操作数据方面哪一个更方便,Pandas是由数据科学家专门为数据分析设计的一款开源软件,并且有成千上万的代码贡献者帮助改进,工具函数越来越多,易用性越来越好。本系列文前面还有两篇《Pandas管理和操作数据比 SQL 更简洁!》和《Pandas 管理和操作数据比SQL更灵活》,感兴趣的可阅读。特别说明,本文以下内容摘译自英文ponder网,头条文章中不允许提供网站链接,感兴趣可自己搜索;示例代码测试环境为VScode下的Jupyter Notebook。


数据准备

import pandas as pd
sf_permits = pd.read_csv("E:/archive/Building_Permits.csv")
sf_permits.head()

输出结果如下图:

构建复杂查询

使用Pandas构建比较复杂的查询,可以在其他查询的结果上进一步增加新的查询,同时还可以查询此前其他查询的结果,以便检查此前其他查询结果的正确性。例如,在准备好的数据集中,想查询与"Geary"相关的街道名称,查询代码如下:

sf_permits[sf_permits['Street Name'] == 'Geary']

输出结果如下图:

从输出结果中可以看出,与“Geary”相关的许多相邻的街道信息“Neighborhoods - Analysis Boundaries”,如下图:

整个数据的输出结果一共有43列,如果只想要'Neighborhoods - Analysis Boundaries'这一列,把其他42列删除,那么只需要在前面语句的末尾增加[['Neighborhoods - Analysis Boundaries']],代码如下:

sf_permits[sf_permits['Street Name'] == 'Geary'][['Neighborhoods - Analysis Boundaries']]

输出结果如下图:

一共有1966行,在此基础上做进一步查询。假如想要进一步查询与Geary相邻的街道信息,按“permits”值从大到小排序,那只需要在前面查询语句的基础上,增加“sort_values(by = ['Neighborhoods - Analysis Boundaries']).value_counts()”即可,代码如下:

sf_permits[sf_permits['Street Name'] == 'Geary'][['Neighborhoods - Analysis Boundaries']].sort_values(by = ['Neighborhoods - Analysis Boundaries']).value_counts()

输出结果如下图:

以上这些查询语句,用SQL都可以实现,但是写SQL查询代码是非常痛苦的,不能一层层地在末尾追加查询条件,因为每一个查询条件的变化都有特定的位置,例如,SQL查询语句中要改变输出数据的列,就需要修改此前的查询SELECT的内容,而使用Pandas就可以顺着思路一步一步地追加查询条件。

处理查询的中间结果

Pandas自诞生以来,就借鉴了其他编程语言对数据操作的惯用方法,例如,可以把dataframe赋值给变量,可以直接操作该变量,也可以把该变量赋值给其他变量。现在写一段代码,查询数据集中有多少空值,并且检查每列有多少个空值,代码如下:

missing_values_count = sf_permits.isnull().sum()
missing_values_count

输出结果如下:

从输出结果中可以看出,整个数据集共有43列、199000行,非空值是大多数列都有空值,因此就需要对该数据集进行清理,设定一个清理条件:非空值不能低于190000,否则就删除该列,操作代码如下:

sf_permits_cleaned = sf_permits.dropna(axis='columns',thresh=190000)
sf_permits_cleaned

输出结果如下:


从输出结果可以看出,清理以后的数据集只有198900行19列,这样的操作在Pandas中是非常方便的,只需要定义一个新的变量 “sf_permits_cleaned”,按照一般变量赋值即可;如果用SQL来操作,可以达到类似的结果,但是需要定义视图,然后在视图的基础上进行操作,不那么直观,也比较难处理!

快速获得数据集的统计信息

使用Pandas,有许多方法可以快速获得dataframe的数据及其元数据的全部信息,也可以使用函数head/tail()获得头部或尾部的几行数据及其元数据的信息。为了方便起见,适应显示其大小,用“...”隐藏了更多列和行的信息。使用info()函数可以获得dataframe的总体信息,代码如下:

sf_permits_cleaned.info()

输出结果如下:

从图中可以看出,含有空值的列都是描述性的列,其他列几乎都没有空值。Pandas还提供了一个函数describe(),用于专门获取描述性的列的统计数据,如总数、均值、方差及其分位数,代码如下:

sf_permits_cleaned.describe()

输出结果如下:

以上结果出现了一个奇怪的现象,street number的min是0,其实就是某个街道不存在。

这样的操作对于SQL来说,就很繁琐了,需要写专门的查询语句,并且数值类型的列越多,查询语句越长。

数据可视化

Pandas内置了可视化函数,而SQL没有可视化能力。看看示例代码:

sf_permits_cleaned["Current Status"].value_counts().plot(kind ="bar")

输出结果如下:

图中包含了各分类的数据柱状图。

Pandas和SQL在以上几个方面的比较,只是站在终端用户的角度来看,Pandas有很多优点;但是二者的目标不同,设计理念也不同,Pandas因数据科学而生,应用在机器学习方面肯定非常方便,而SQL是从属于数据库系统,从更多的角度看,两者都没有可比性。

(本文完)

展开阅读全文

页面更新:2024-03-20

标签:操作   数据   赋值   变量   语句   函数   街道   条件   代码   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top