博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python骚包的操作,用SQL方式的去玩Pandas
阅读量:6784 次
发布时间:2019-06-26

本文共 3233 字,大约阅读时间需要 10 分钟。

Pandas是一个非常方便的数据处理、数据分析的类库,在 这篇文章中,我将Pandas进行了一个系统的梳理。

但不可否认的是,不是所有的程序员都会Python,也不是所有的Pythoner都会使用Pandas。

不过好消息是,借助于pandassql,你可以使用SQL来操作DataFrame。

# 导入相关库import numpy as npimport pandas as pdfrom pandasql import sqldf, load_meat, load_births复制代码

基础

pandasql 中的主要函数是 sqldf,它接收两个参数:

  • 一个sql查询语句
  • 一组会话/环境变量(locals()globals()

为了方便起见,我们可以定义一个函数来方便我们调用。

pysqldf = lambda sql: sqldf(sql, globals())复制代码

接下来我们导入一些数据。

meat = load_meat()meat.head()复制代码
date beef veal pork lamb_and_mutton broilers other_chicken turkey
0 1944-01-01 751.0 85.0 1280.0 89.0 NaN NaN NaN
1 1944-02-01 713.0 77.0 1169.0 72.0 NaN NaN NaN
2 1944-03-01 741.0 90.0 1128.0 75.0 NaN NaN NaN
3 1944-04-01 650.0 89.0 978.0 66.0 NaN NaN NaN
4 1944-05-01 681.0 106.0 1029.0 78.0 NaN NaN NaN
births = load_births()births.head()复制代码
date births
0 1975-01-01 265775
1 1975-02-01 241045
2 1975-03-01 268849
3 1975-04-01 247455
4 1975-05-01 254545

查询

pandassql 使用的语法是 SQLite 的语法。任何 DataFrame 都会被 pandassql 自动检测到,你可以将它们作为来查询。

限定条数

先来看下如何去限定数据条数。这里来获取下前两条数据。

sql = "select * from births limit 2"pysqldf(sql)复制代码
date births
0 1975-01-01 00:00:00.000000 265775
1 1975-02-01 00:00:00.000000 241045

除了可以限定从头开始的前N条数据外,我们还可以设置偏移量。这里来获取下从第二行开始的前两条数据。

sql = "select * from births limit 2 offset 2"pysqldf(sql)复制代码
date births
0 1975-03-01 00:00:00.000000 268849
1 1975-04-01 00:00:00.000000 247455

限定字段

既然是SQL,我们当然可以限定查询时的所需字段了。这里我们限定只获取指定的births字段。

sql = "select births from births limit 2"pysqldf(sql)复制代码
births
0 265775
1 241045

排序

排序功能也是非常常见的,pandassql 完美支持。这里我们按照 date 降序,births 升序来排。

sql = "select * from births order by date desc, births asc limit 2"pysqldf(sql)复制代码
date births
0 2012-12-01 00:00:00.000000 340995
1 2012-11-01 00:00:00.000000 320195

限定查询条件

我们可以指定 where 来查询满足要求的数据。这里我们筛选出 turkey 不为空并且 date 在 1974-12-31 之后的数据。

sql = """select *from meatwhere turkey not nulland date > '1974-12-31'limit 5"""pysqldf(sql)复制代码
date beef veal pork lamb_and_mutton broilers other_chicken turkey
0 1975-01-01 00:00:00.000000 2106.0 59.0 1114.0 36.0 646.2 None 64.9
1 1975-02-01 00:00:00.000000 1845.0 50.0 954.0 31.0 570.2 None 47.1
2 1975-03-01 00:00:00.000000 1891.0 57.0 976.0 35.0 616.6 None 54.4
3 1975-04-01 00:00:00.000000 1895.0 60.0 1100.0 34.0 688.3 None 68.7
4 1975-05-01 00:00:00.000000 1849.0 59.0 934.0 31.0 690.1 None 81.9

聚合

数据分析时,聚合必不可少,pandassql 当然也支持了。这里我们按照年份来分组,然后对 births 求和、求均值、求最大值以及求最小值。

sql = """select strftime('%Y', date) as year,sum(births),avg(births),max(births),min(births)from birthsgroup bystrftime('%Y', date)limit 3"""pysqldf(sql)复制代码
year sum(births) avg(births) max(births) min(births)
0 1975 3136965 261413.750000 281300 241045
1 1976 6304156 262673.166667 286496 236551
2 1979 3333279 277773.250000 302805 249898

关联

关联也是非常常见的操作。这里我们根据字段 date 作为条件来关联 meat 和 births 这两个DataFrame。

sql = """selectm.date, b.births, m.beeffrom meat minner join births bon m.date = b.dateorder bym.datelimit 5;"""pysqldf(sql)复制代码
date births beef
0 1975-01-01 00:00:00.000000 265775 2106.0
1 1975-02-01 00:00:00.000000 241045 1845.0
2 1975-03-01 00:00:00.000000 268849 1891.0
3 1975-04-01 00:00:00.000000 247455 1895.0
4 1975-05-01 00:00:00.000000 254545 1849.0

以上是我列举的一些常用功能,除了这些之外,pandassql 还支持更多的一些操作,这些操作都是基于 SQLite 的语法来完成的,感兴趣的话可以自己研究。


想要学习更多关于人工智能的知识,请关注公众号:AI派

转载地址:http://iudgo.baihongyu.com/

你可能感兴趣的文章
Window系统查找并关闭进程中的端口
查看>>
BZOJ2151种树——模拟费用流+链表+堆
查看>>
Computers 递推题 sum[i][j]=max(sum[i-1][i-1]+c+sum[i][j],sum[i-1][j]);
查看>>
css clear属性
查看>>
求助listview展开子child问题
查看>>
安卓下面的webview配置问题 玩h5游戏失败
查看>>
机器指令处理的数据所在位置
查看>>
第三次作业
查看>>
北大acm1004
查看>>
Difference Search Path
查看>>
用vue实现博客列表的级联效果
查看>>
react-navigation 使用教程(配完整项目)
查看>>
.NET Core 2.1 Preview 2带来网络方面的改进
查看>>
从达尔文到DevOps:John Willis和Gene Kim谈后凤凰项目时代
查看>>
简析Uber的可伸缩监控:uMonitor和Neris
查看>>
腾讯云答治茜:云计算为独角兽和传统企业提供了哪些沃土?
查看>>
Spark on YARN 部署案例
查看>>
RedHat发布JBoss 7.2,完全支持Java EE 8规范
查看>>
kubernetes1.9.2基于kubeadm的高可用安装HA
查看>>
「性能优化之道」每秒上万并发下的Spring Cloud参数优化实战
查看>>