代码详解:用SQL GROUP BY语句,找出最强精灵宝可梦


640?wx_fmt=jpeg


全文共3168字,预计学习时长6分钟


640?wx_fmt=png

图片来源:Unsplash/Jay


本文所涉及代码均可在GitHub中获取:https://github.com/rmacaraeg


知道如何在SQL内完成基础操作后(如果不知道,请阅读“Python SQL基础简介”,传送门:https://medium.com/better-programming/a-gentle-introduction-to-sql-basics-in-python-b137651ed1ff),就可以开始使用SQL提供的更多其他工具了。


GROUP BY语句是SQL中一个很实用的工具。有了它,就可以对数据进行深入研究,并使用一些函数将相同数据进行分组。


如果一栏中不同的行具有相同的值,这些行就会被放到一个单独的分组中。


使用GROUP BY语句要注意以下重要的三点:


1. GROUP BY 是与SELECT语句一起使用的。


2. 查询时,GROUP BY位于WHERE语句之后。


3. 查询时,GROUP BY置于ORDER BY语句之前(如果使用到ORDER BY)。


在了解这些基本规则以后,就可以打开笔记本电脑进行实操了!


640?wx_fmt=jpeg

设置


以下例子将使用Kaggle数据集(https://www.kaggle.com/abcsds/pokemon)中Pokémon游戏的数据。


640?wx_fmt=jpeg

图片来源:unsplash.com/@melvina


尽管使用游戏数据是为了给SQL增加趣味性,这些例子同样也非常适用于更加商业化的决策,比如按照年龄段,收入水平,地理位置等给人群进行分组。


首先导入所需的库,并在python中加载CSV文件。

 
 

import pandas as pd

import sqlite3

cnx = sqlite3.connect(':memory:')

csvfile = ('/Users/randy/Documents/GitHub/Pokemon-Stat-Predictor/Pokemon.csv') #Original data

columns = ['#','name','type1','type2','total','hp','attack','defense',\

           'sp_atk','sp_def','speed','generation','legendary']

#open the csv file

df = pd.read_csv(csvfile, names=columns, header=0


接下来,先清理数据,然后将其导入SQLite数据库(https://www.sqlite.org/):


 
 

#find NaN values

nan_rows = df[df.isnull().T.any().T]

nan_rows.head()


这一步将会找到所有空值并返回其中一部分(如果有的话)。


当所有空值都出现在type2一栏时,将所有空值都变成“none”。

 
 

#change all Type 2 NaN values to 'None':

df['type2'] = df['type2'].fillna('none')


因为SQL对字符串很敏感(同一字符串大写与小写代表含义不同),所以要将所有字符都设置为小写形式。


 
 

#change all strings within the dataframe to lower case

df = df.astype(str).apply(lambda x: x.str.lower())


然后将其设置为一个SQL数据库。


 
 

#set the database for pokemon

df.to_sql('pokemon', con=cnx, if_exists='append', index=False)#function for the SQL queries below

def sql_query(query):

    return pd.read_sql(query, cnx)


太棒了,接下来可以开始执行一些SQL语句!


640?wx_fmt=jpeg

GROUP BY的基本语法


GROUP BY函数的基本语法是:

 
 

SELECT column_name(s), function_name(column_name)

FROM table_name

WHERE condition

GROUP BY column_name(s)

ORDER BY column_name(s);


function_name: SUM(), AVG(), MIN(), MAX(), COUNT().

table_name: name of the table. In this example, there is only the pokemon table

condition: condition used.


有了它,就可以重新组织和操作数据,以得到更好的分析。


640?wx_fmt=jpeg

简单的GROUP BY语句


如果只想得到Pokémon中能力最高的那个精灵的名称,类别与总能力值,可以以一个简单的MAX()查询开始:


 
 

query = '''

SELECT name, type1, type2, MAX(total)

FROM pokemon

WHERE legendary = 'true';

'''

sql_query(query)


这个操作将输出超级Mewtwo X,一个同时具有精神与战斗属性,总能力值高达780的Pokémon。


但如果只想要了解type1种类下能力最强的Pokémon呢?GROUP BY语句在这时就展现出其用武之地了:


 
 

query = '''

SELECT name, type1, type2, MAX(total)

FROM pokemon

WHERE legendary = 'true'

GROUP BY type1;

'''

sql_query(query)


现在输出的就不只是一个Pokémon(超级Mewtwo X)了,而是14个传奇的小精灵。


SQL查询找到了所有传奇小Pokémon,并基于type1栏将它们分到了单独的组中。


Pokémon在被分到了暗系、龙系、电系、飞行系等不同的组后,SQL查询将返回每一个组中小Pokémon的名字、type1、type2与总能力值。


640?wx_fmt=jpeg

GROUP BY和HAVING语句


WHERE语句能给各栏加设条件,但如果想要给组加设条件呢?引入HAVING语句!


由于WHERE关键词不能用在聚合函数中,在此选用带有GROUP BY的HAVING语句。


可以用HAVING语句输入条件来决定哪一组将会成为最终结果的一部分。同样的, WHERE语句对聚合函数不起任何作用。所以如果想要加设条件,就要将HAVING语句用于聚合函数中。


HAVING语句的基本语法:


 
 

SELECT column_name(s)

FROM table_name

WHERE condition

GROUP BY column_name(s)

HAVING condition

ORDER BY column_name(s);


640?wx_fmt=jpeg

带有HAVING语句的GROUP BY


640?wx_fmt=jpeg

图片来源:unsplash.com/@jeshoots


如果想知道所有Pokémon的数量、type1、最小和最大总能力值与所有type1分组下小Pokémon的平均HP,且只包含那些总HP值高于4000的Pokémon组:

 
 

query = '''

SELECT COUNT(name) as pokemon_count, type1, MIN(total), MAX(total), AVG(HP)

FROM pokemon

GROUP BY type1

HAVING SUM(HP) > 4000;

'''

sql_query(query)


这有助于确定哪些小Pokémon组在其类别中具有最高的HP值,同时也能剔除事先设定好的HP小于4000的Pokémon组。


如果想从具有高HP值的小Pokémon里进行挑选,最好选择普通type1组,其中的小精灵具有最高平均HP值(77.28)且非常耐打。


HAVING语句真的有助于精简数据,并得出更有用更深刻的结果。


640?wx_fmt=jpeg

留言 点赞 发个朋友圈

我们一起分享AI学习与发展的干货


编译组:段昌蓉、杨敏迎 

相关链接:

https://medium.com/better-programming/sql-group-bys-in-python-547f526eeb41


如需转载,请后台留言,遵守转载规范


推荐文章阅读


ACL2018论文集50篇解读

EMNLP2017论文集28篇论文解读

2018年AI三大顶会中国学术成果全链接

ACL2017 论文集:34篇解读干货全在这里

10篇AAAI2017经典论文回顾


长按识别二维码可添加关注

读芯君爱你


640?wx_fmt=gif

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值