“真”pandas“假”sql
这篇博客利用了
pandas对数据像sql一样去处理。
读取测试数据
import pandas as pd
import numpy as np
url = 'https://raw.github.com/pandas-dev/pandas/master/pandas/tests/data/tips.csv'
tips = pd.read_csv(url) # 读取数据
tips.head()
测试数据的前5行如下:
SELECT(选择语句)
SQL语句:
SELECT total_bill, tip, smoker, time FROM tips LIMIT 5;
Python语句:
tips[['total_bill', 'tip', 'smoker', 'time']].head(5)

UPDATE(更新语句)
SQL语句:
UPDATE tips SET tip = tip*2 WHERE tip < 2;
Python语句:
tips.loc[tips['tip'] < 2, 'tip'] *= 2
DELETE(删除语句)
SQL语句:
DELETE FROM tips WHERE tip > 9;
Python语句:
tips = tips.loc[tips['tip'] <= 9]
WHERE (条件)
SQL语句:
SELECT * FROM tips WHERE time = 'Dinner' LIMIT 5;
Python语句:
tips[tips['time'] == 'Dinner'].head(5)

AND&OR
SQL语句:
SELECT * FROM tips WHERE time = 'Dinner' AND tip >5.00;
Python语句:
# pandas中用“&”表示and;用“|”表示or
tips[(tips['time'] == 'Dinner') & (tips['tip'] > 5.00)]

SQL语句:
SELECT * FROM tips WHERE size >= 5 OR total_bill > 45;
Python语句:
# 选出size大于5或者total_bill大于45的
tips[(tips['size'] >=5 ) | (tips['total_bill'] > 45)]

GROUP BY (分组聚合)
在pandas中,使用类似命名的 groupby() 方法执行SQL的GROUP BY操作。 groupby() 通常是指我们要将数据集拆分为组,应用一些函数(通常是聚合),然后将组合在一起的过程。
常见的SQL操作将在整个数据集中获取每个组中的记录计数。 例如,一个查询让我们得到性别剩余的提示数:
SQL语句:
SELECT sex, count(*) FROM tips GROUP BY sex;
/*
Female 87
Male 157
*/
Python语句:
# sql中的ocunt和pandas的count不一样,这里是size()达到我们的目的
tips.groupby('sex').size()

Python语句:
tips.groupby('sex').count()

Python语句:
# 对单独一列进行count
tips.groupby('sex')['total_bill'].count()

SQL语句:
SELECT day, AVG(tip), COUNT(*) FROM tips GROUP BY day;
/*
Fri 2.734737 19
Sat 2.993103 87
Sun 3.255132 76
Thur 2.771452 62
*/
也可以同时应用多种功能。 例如,假设我们希望看到技巧数量在星期几之间有所差异,那么 agg() 可以让您将一个字典传递到您分组的 DataFrame ,指示哪些功能适用于特定的列。
Python语句:
tips.groupby('day').agg({'tip':np.mean, 'day':np.size})

按多列分组
SQL语句:
SELECT smoker, day, COUNT(*), AVG(tip) FROM tips GROUP BY smoker, day;
/*
smoker day
No Fri 4 2.812500
Sat 45 3.102889
Sun 57 3.167895
Thur 45 2.673778
Yes Fri 15 2.714000
Sat 42 2.875476
Sun 19 3.516842
Thur 17 3.030000
*/
Python语句:
tips.groupby(['smoker','day']).agg({'tip':[np.size,np.mean]})

缺失值的检查使用 notnull() 和 isnull()
重新建立一个测试数据集:
df = pd.DataFrame({'col2':['A','B',np.NaN, 'C', 'D'],
'col1':['F', np.NaN, 'G','H','I']})

SQL语句:
SELECT * FROM df WHERE col2 IS NULL;
Python语句:
# 选择变量是col为null的行(观测)
df[df['col2'].isnull()]

SQL语句:
SELECT * FROM df WHERE col1 IS NOT NULL;
Python语句:
# 选择col1不是空值的行(观测)
df[df['col1'].notnull()]

JOIN
可以使用 join() 或 merge() 执行 JOIN 。 默认情况下, join() 将在其索引上加入 DataFrames 。 每个方法都有参数允许您指定要执行的连接类型(LEFT,RIGHT,INNER,FULL)或要加入的列(列名称或索引)。
df1 = pd.DataFrame({'key':['A','B','C','D'], 'value':np.random.randn(4)})
df2 = pd.DataFrame({'key':['B','D','D','E'], 'value':np.random.randn(4)})


INNER JOIN
SQL语句:
SELECT * FROM df1 INNER JOIN df2 ON df1.key = df2.key;
Python语句:
pd.merge(df1,df2, on = 'key')

indexed_df2 = df2.set_index('key')
pd.merge(df1, indexed_df2, left_on='key',right_index=True)

LEFT OUTER JOIN
SQL语句:
-- show all records from df2
SELECT * FROM df1 RIGHT OUTER JOIN df2 ON df1.key=df2.key;
Python语句:
pd.merge(df1, df2, on = 'key', how='left')

RIGHT OUTER JOIN
SQL语句:
-- show all records from both tables
SELECT * FROM df1 FULL OUTER JOIN df2 ON df1.key = df2.key;
Python语句:
pd.merge(df1, df2, on = 'key', how='right')

FULL JOIN
SQL语句:
-- show all records from both tables
SELECT * FROM df1 FULL OUTER JOIN df2 ON df1.key = df2.key;
Python语句:
pd.merge(df1, df2 , on = 'key', how = 'outer')

UNION
新建数据集:
df1 = pd.DataFrame({'city': ['Chicago', 'San Francisco', 'New York City'],
'rank': range(1, 4)})
df2 = pd.DataFrame({'city': ['Chicago', 'Boston', 'Los Angeles'],
'rank': [1, 4, 5]})
SQL语句:
SELECT city, rank FROM df1
UNION ALL
SELECT city, rank FROM df2;
/*
city rank
Chicago 1
San Francisco 2
New York City 3
Chicago 1
Boston 4
Los Angeles 5
*/
Python语句:
pd.concat([df1,df2])

SQL UNION类似于UNION ALL,但是UNION将删除重复的行。
SELECT city, rank FROM df1
UNION
SELECT city, rank FROM df2;
-- notice that there is only one Chicago record this time
/*
city rank
Chicago 1
San Francisco 2
New York City 3
Boston 4
Los Angeles 5
*/
在pandas中,您可以使用 concat() 与 drop_duplicate() 结合使用。
pd.concat([df1, df2]).drop_duplicates()
“真”pandas“假”sql的更多相关文章
- 真与假与c#,java中的不同之处
/************真与假************/ /*C语言中:真(非0).假(0) * Java.C#中:真(true).假(false) * JavaScript中:真(非0.true. ...
- pandas 读写sql数据库
如何从数据库中读取数据到DataFrame中? 使用pandas.io.sql模块中的sql.read_sql_query(sql_str,conn)和sql.read_sql_table(table ...
- JavaScript基本概念C - 真与假
真与假 与 c 和 c++ 非常相似, 但与 Java 不同, JS中被认为true或false范围很广.所有对象 (空字符串除外) 和非零数字都被视为 true.空字符串.零.null 和undef ...
- python入门:while循环里面True和False的作用,真和假
#!/usr/bin/env python # -*- coding:utf-8 -*- #while循环里面True和False的作用,真和假 """ n1等于真(Tr ...
- 【Pandas vs SQL】数据分析代码逐行比对,孰优孰劣?
在数据分析领域,pandas是python数据分析基础工具,SQL是数据库最常用分析语言.二者有相通的地方,也有很大的语法不同,做起数据分析来,谁将更胜一筹呢? 做过业务开发.跟数据库打交道比较多的小 ...
- Python的真和假
python和其他编程语言一样,,,0是假,非0是真,,python 一切皆对象,真假是每个对象的属性.像数据结构,,空的数据结构是False. eg: "spam" True & ...
- Pandas与SQL比较
由于许多潜在的Pandas用户对SQL有一定的了解,因此本文章旨在提供一些如何使用Pandas执行各种SQL操作的示例. import pandas as pd url = 'tips.csv' ti ...
- JavaScript中的真和假,==和===, 不等
咋JS中,下面这些值表示 “假”: "" (empty string) 0,-0,NaN (invalid number) null, undefined false 除了上面这些 ...
- PHP empty函数判断0返回真还是假?
最近项目中,遇到一个字段是 “是否启用”值为0,1 在查询时没想就写了 if ( isset($args_array['useFlg']) && !empty($args_array[ ...
随机推荐
- html学习笔记整理
网页 1.网页的组成部分 网页是由文字,图片,视频,音频,输入框,按钮这些元素(也就是html标签)组成. 2.浏览网页常用的五大主流浏览器 谷歌,IE,火狐,欧朋,safari.浏览器的内核(渲染引 ...
- Xcodebuild命令使用
Xcodebuild简介 Xcodebuild是命令行工具包的其中一项. 命令行工具包(Command Line Tools)是一个轻量的.可以与XCode分开的.在Mac上单独下载的命令行工具包. ...
- 详解慢查询日志的相关设置及mysqldumpslow工具
概述 mysql慢查询日志是mysql提供的一种日志记录,它是用来记录在mysql中相应时间超过阈值的语句,就是指运行时间超过long_query_time值的sql,会被记录在慢查询日志中.long ...
- netty源码解解析(4.0)-18 ChannelHandler: codec--编解码框架
编解码框架和一些常用的实现位于io.netty.handler.codec包中. 编解码框架包含两部分:Byte流和特定类型数据之间的编解码,也叫序列化和反序列化.不类型数据之间的转换. 下图是编解码 ...
- Mybatis-Spring扫描路径有重叠导致Invalid bound statement(not found)问题
背景 近日,某个系统的测试环境mybatis总是报Invalid bound statement(not found)异常,导致tomcat容器无法启动.异常信息如下: org.apache.ibat ...
- 基于注解的SpringAOP源码解析(三)
注意,读完本篇文章需要很长很长时间 在之前的2篇文章:AOP源码分析(一)AOP源码分析(二) 中,我们搭建了SpringAOP源码分析的环境,介绍了@EnableAspectJAutoProxy注解 ...
- IntelliJ IDEA 从入门到上瘾教程,2019图文版!
前言:IntelliJ IDEA 如果说IntelliJ IDEA是一款现代化智能开发工具的话,Eclipse则称得上是石器时代的东西了. 其实笔者也是一枚从Eclipse转IDEA的探索者,随着近期 ...
- ngxin安装之yum安装
nginx部署至yum安装 1. 配置nginx所需的YUM源 [root@nginx]# cat /etc/yum.repos.d/yum.repo [nginx-stable] name=ngin ...
- Java NIO系列之[说在前面的话]
在开始这个系列文章之前,先聊一些题外话,说说我为什么要写Java NIO这个系列技术文章(不看完会错失一个亿的),因为Java NIO并不像JVM,中间件源码那么有吸引力,但这个技术点是java的基础 ...
- zabbix设置钉钉报警
1 添加机器人 在钉钉群里面添加一个机器人 会获取到一个URL: 'https://oapi.dingtalk.com/robot/send?access_token=62be1ea97b4653b8 ...