640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 王伟同学

责编 | 郭芮

Pandas是一个非常方便的数据处理、数据分析的类库,也是每个Pythoner 做数据分析必备的神器。但不可否认的是,不是所有的程序员都会Python,也不是所有的Pythoner都会使用Pandas。

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

# 导入相关库
import numpy as np
import pandas as pd

from pandasql import sqldf, load_meat, load_births


640?wx_fmt=png

基础


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

  • 一个SQL 查询语句;

  • 一组会话/环境变量(locals() 或 globals())。

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

pysqldf = lambda sql: sqldf(sql, globals())

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

meat = load_meat()
meat.head()

datebeefvealporklamb_and_muttonbroilersother_chickenturkey
01944-01-01751.085.01280.089.0NaNNaNNaN
11944-02-01713.077.01169.072.0NaNNaNNaN
21944-03-01741.090.01128.075.0NaNNaNNaN
31944-04-01650.089.0978.066.0NaNNaNNaN
41944-05-01681.0106.01029.078.0NaNNaNNaN
births = load_births()
births.head()

datebirths
01975-01-01265775
11975-02-01241045
21975-03-01268849
31975-04-01247455
41975-05-01254545


640?wx_fmt=png

查询


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

限定条数

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

sql = "select * from births limit 2"
pysqldf(sql)

datebirths
01975-01-01 00:00:00.000000265775
11975-02-01 00:00:00.000000241045

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

sql = "select * from births limit 2 offset 2"
pysqldf(sql)

datebirths
01975-03-01 00:00:00.000000268849
11975-04-01 00:00:00.000000247455

限定字段

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

sql = "select births from births limit 2"
pysqldf(sql)

births
0265775
1241045

排序

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

sql = "select * from births order by date desc, births asc limit 2"
pysqldf(sql)

datebirths
02012-12-01 00:00:00.000000340995
12012-11-01 00:00:00.000000320195

限定查询条件

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

sql = """
select *
from meat
where turkey not null
and date > '1974-12-31'
limit 5
"""

pysqldf(sql)

datebeefvealporklamb_and_muttonbroilersother_chickenturkey
01975-01-01 00:00:00.0000002106.059.01114.036.0646.2None64.9
11975-02-01 00:00:00.0000001845.050.0954.031.0570.2None47.1
21975-03-01 00:00:00.0000001891.057.0976.035.0616.6None54.4
31975-04-01 00:00:00.0000001895.060.01100.034.0688.3None68.7
41975-05-01 00:00:00.0000001849.059.0934.031.0690.1None81.9

聚合

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

sql = """
select 
strftime('%Y', date) as year,
sum(births),
avg(births),
max(births),
min(births)
from births
group by
strftime('%Y', date)
limit 3
"""

pysqldf(sql)

yearsum(births)avg(births)max(births)min(births)
019753136965261413.750000281300241045
119766304156262673.166667286496236551
219793333279277773.250000302805249898

关联

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

sql = """
select
m.date, b.births, m.beef
from meat m
inner join births b
on m.date = b.date
order by
m.date
limit 5;
"""

pysqldf(sql)

datebirthsbeef
01975-01-01 00:00:00.0000002657752106.0
11975-02-01 00:00:00.0000002410451845.0
21975-03-01 00:00:00.0000002688491891.0
31975-04-01 00:00:00.0000002474551895.0
41975-05-01 00:00:00.0000002545451849.0

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

声明:本文为公众号 AI派 投稿,版权归对方所有。

640?wx_fmt=gif

640?wx_fmt=gif

Logo

20年前,《新程序员》创刊时,我们的心愿是全面关注程序员成长,中国将拥有新一代世界级的程序员。20年后的今天,我们有了新的使命:助力中国IT技术人成长,成就一亿技术人!

更多推荐