这篇博客利用了 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的更多相关文章

  1. 真与假与c#,java中的不同之处

    /************真与假************/ /*C语言中:真(非0).假(0) * Java.C#中:真(true).假(false) * JavaScript中:真(非0.true. ...

  2. pandas 读写sql数据库

    如何从数据库中读取数据到DataFrame中? 使用pandas.io.sql模块中的sql.read_sql_query(sql_str,conn)和sql.read_sql_table(table ...

  3. JavaScript基本概念C - 真与假

    真与假 与 c 和 c++ 非常相似, 但与 Java 不同, JS中被认为true或false范围很广.所有对象 (空字符串除外) 和非零数字都被视为 true.空字符串.零.null 和undef ...

  4. python入门:while循环里面True和False的作用,真和假

    #!/usr/bin/env python # -*- coding:utf-8 -*- #while循环里面True和False的作用,真和假 """ n1等于真(Tr ...

  5. 【Pandas vs SQL】数据分析代码逐行比对,孰优孰劣?

    在数据分析领域,pandas是python数据分析基础工具,SQL是数据库最常用分析语言.二者有相通的地方,也有很大的语法不同,做起数据分析来,谁将更胜一筹呢? 做过业务开发.跟数据库打交道比较多的小 ...

  6. Python的真和假

    python和其他编程语言一样,,,0是假,非0是真,,python 一切皆对象,真假是每个对象的属性.像数据结构,,空的数据结构是False. eg: "spam" True & ...

  7. Pandas与SQL比较

    由于许多潜在的Pandas用户对SQL有一定的了解,因此本文章旨在提供一些如何使用Pandas执行各种SQL操作的示例. import pandas as pd url = 'tips.csv' ti ...

  8. JavaScript中的真和假,==和===, 不等

    咋JS中,下面这些值表示 “假”: "" (empty string) 0,-0,NaN (invalid number) null, undefined false 除了上面这些 ...

  9. PHP empty函数判断0返回真还是假?

    最近项目中,遇到一个字段是 “是否启用”值为0,1 在查询时没想就写了 if ( isset($args_array['useFlg']) && !empty($args_array[ ...

随机推荐

  1. python第一课--基础知识

    python简介 Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的 ...

  2. Git下载加速教程

    方法一 大家普遍采取的是更改本地的host文件,然后cmd命令刷新 1.访问这里,依次获取下面三个url的ping的ip github.com github.global.ssl.fastly.net ...

  3. neural_transfer风格迁移

    ContentLoss 首先是要定义一个内容差异损失函数,这里直接调用functional.mse_loss(input,self.target)就可以计算出其内容差异损失. 注意这里一般是定义一个网 ...

  4. 基于SpringBoot从零构建博客网站 - 分页显示文章列表功能

    显示文章列表一般都是采用分页显示,比如每页10篇文章显示.这样就不用每次就将所有的文章查询出来,而且当文章数量特别多的时候,如果一次性查询出来很容易出现OOM异常. 后台的分页插件采用的是mybati ...

  5. .net测试篇之单元测试/集成测试神器Autofixture

    autofixture简介 有了单元测试框架加上Moq(后面我们会用单独章节来介绍moq),可以说测试问题基上都能搞定了.然而有了AutoFixture对单元测试来说可以说是如虎添翼,AutoFixt ...

  6. node爬虫的几种简易实现方式

    说到爬虫大家可能会觉得很NB的东西,可以爬小电影,羞羞图,没错就是这样的.在node爬虫方面,我也是个新人,这篇文章主要是给大家分享几种实现node 爬虫的方式.第一种方式,采用node,js中的 s ...

  7. 逆向破解之160个CrackMe —— 016

    CrackMe —— 016 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  8. JavaScript数组方法大全(第一篇)

    数组方法大全(第一篇) 注意:第一次写博客有点小紧张,如有错误欢迎指出,如有雷同纯属巧合,本次总结参考书籍JavaScript权威指南,有兴趣的小伙伴可以去翻阅一下哦 join()方法 该方法是将数组 ...

  9. nginx对特定参数限流

    接到一个需求, 需要对请求(GET)里面的某个参数  的特定的值, 进行限流; 因为不限流的话, 不知道什么时候这个id的请求飙一下, 服务端就被压死了... 就像这样: /index.html?id ...

  10. SSH开发模式——Struts2(第三小节)

    struts2框架的知识点,虽然分了几个小节,感觉内容还是挺多的,但是你仅仅是入门了而已,想要进一步地提升自己,你得有一颗持之以恒的学习的心,最后的内容我都将在这篇博客中讲到,所以篇幅可能会有点长,希 ...