Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析
Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析
一、加载数据
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)
output = tips.head()
Output:
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
二、SELECT 的使用方式
sql 语句: SELECT total_bill, tip, smoker, time FROM tips LIMIT 5;。
output = tips[['total_bill', 'tip', 'smoker', 'time']].head(5)
Output:
total_bill tip smoker time
0 16.99 1.01 No Dinner
1 10.34 1.66 No Dinner
2 21.01 3.50 No Dinner
3 23.68 3.31 No Dinner
4 24.59 3.61 No Dinner
三、WHERE 的使用方式
1. 举个栗子
sql 语句: SELECT * FROM tips WHERE time = 'Dinner' LIMIT 5;
output = tips[tips['time'] == 'Dinner'].head(5)
# 或者
output = tips.query("time == 'Dinner'").head(5)
Output:
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
2. 比较运算符:等于 ==、 大于 >、 大于等于 >=、小于等于 <=、不等于 !=
2.1 等于 ==
sql 语句:SELECT * FROM tips WHERE time = 'Dinner';。
output = tips[(tips['time'] == 'Dinner')]
2.2 大于 >
sql 语句:SELECT * FROM tips WHERE tip > 5.00;。
output = tips[(tips['tip'] > 5.00)]
2.3 大于等于 >=
sql 语句:SELECT * FROM tips WHERE tip >= 5.00;。
output = tips[(tips['size'] >= 5)]
2.4 小于等于 <=
sql 语句:SELECT * FROM tips WHERE tip <= 5.00;。
output = tips[(tips['size'] <= 5)]
2.5 不等于 !=
sql 语句:SELECT * FROM tips WHERE tip <> 5.00;。
output = tips[(tips['size'] != 5)]
3. 逻辑运算符:且 &、或 |、非 -
3.1 且 &
sql 语句:SELECT * FROM tips WHERE time = 'Dinner' AND tip > 5.00;
output = tips[(tips['time'] == 'Dinner') & (tips['tip'] > 5.00)]
3.2 或 |
sql 语句:SELECT * FROM tips WHERE size >= 5 OR total_bill > 45;。
output = tips[(tips['size'] >= 5) | (tips['total_bill'] > 45)]
3.3 非 -
sql 语句:SELECT * FROM tips WHERE not (size <> 5 AND size > 4);
output = df[-((df['size'] != 5) & (df['size'] > 4))]
4. Null 的判断
这里重新定义一个包含 NaN 数据的 DataFrame。
frame = pd.DataFrame({
'col1': ['A', 'B', np.NaN, 'C', 'D'],
'col2': ['F', np.NaN, 'G', 'H', 'I']
})
output = frame
Output:
col1 col2
0 A F
1 B NaN
2 NaN G
3 C H
4 D I
4.1 判断列是 Null
sql 语句:SELECT * FROM frame WHERE col2 IS NULL;。
output = frame[frame['col2'].isna()]
Output:
col1 col2
1 B NaN
4.2 判断列不是 Null
sql 语句:SELECT * FROM frame WHERE col1 IS NOT NULL;。
output = frame[frame['col1'].notna()]
Output:
col1 col2
0 A F
1 B NaN
3 C H
4 D I
5. In、Like 操作
5.1 In
sql 语句:SELECT * FROM tips WHERE siez in (5, 6);。
output = tips[tips['size'].isin([2, 5])]
5.2 Like
sql 语句:SELECT * FROM tips WHERE time like 'Din%';。
output = tips[tips.time.str.contains('Din*')]
四、GROUP BY 的使用方式
sql 语句:SELECT sex, count(*) FROM tips GROUP BY sex;
output = tips.groupby('sex').size()
# 获取相应的结果
output['Male']
output['Female']
output = tips.groupby('sex').count()
# 获取相应的结果
output['tip']['Female']
output = tips.groupby('sex')['total_bill'].count()
# 获取相应的结果
output['Male']
output['Female']
sql 语句:SELECT day, AVG(tip), COUNT(*) FROM tips GROUP BY day;
output = tips.groupby('day').agg({'tip': np.mean, 'day': np.size})
# 获取相应的结果
output['day']['Fri']
output['tip']['Fri']
sql 语句:SELECT smoker, day, COUNT(*), AVG(tip) FROM tips GROUP BY smoker, day;
output = tips.groupby(['smoker', 'day']).agg({'tip': [np.size, np.mean]})
# 获取相应的结果
output['tip']['size']['No']['Fri']
sql 语句:SELECT tip, count(distinct sex) FROM tips GROUP BY tip;
output = tips.groupby('tip').agg({'sex': pd.Series.nunique})
五、JOIN 连接的使用方式
定义两个 DataFrame。
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)})
1. 内连接 Inner Join
sql 语句:SELECT * FROM df1 INNER JOIN df2 ON df1.key = df2.key;
output = pd.merge(df1, df2, on='key')
# 或
indexed_df2 = df2.set_index('key')
pd.merge(df1, indexed_df2, left_on='key', right_index=True)
2. 左连接 Left Outer Join
sql 语句:SELECT * FROM df1 LEFT OUTER JOIN df2 ON df1.key = df2.key;
output = pd.merge(df1, df2, on='key', how='left')
# 或
output = df1.join(df2, on='key', how='left')
3. 右连接 Right Join
sql 语句:SELECT * FROM df1 RIGHT OUTER JOIN df2 ON df1.key = df2.key;
output = pd.merge(df1, df2, on='key', how='right')
4. 全连接 Full Join
sql 语句:SELECT * FROM df1 FULL OUTER JOIN df2 ON df1.key = df2.key;
output = 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;
output = pd.concat([df1, df2])
sql 语句:SELECT city, rank FROM df1 UNION SELECT city, rank FROM df2;
output = pd.concat([df1, df2]).drop_duplicates()
六、与 SQL 等价的其他语法
1. 去重 Distinct
sql 语句:SELECT DISTINCT sex FROM tips;
output = tips.drop_duplicates(subset=['sex'], keep='first', inplace=False)
2. 修改列别名 As
sql 语句:SELECT total_bill AS total, sex AS xes FROM tips;
output = tips.rename(columns={'total_bill': 'total', 'sex': 'xes'}, inplace=False)
3. Limit 与 Offset
sql 语句:SELECT * FROM tips ORDER BY tip DESC LIMIT 10 OFFSET 5;
output = tips.nlargest(10 + 5, columns='tip').tail(10)
4. 每个 Group 的前几行
sql 语句:
SELECT * FROM (
SELECT
t.*,
ROW_NUMBER() OVER(PARTITION BY day ORDER BY total_bill DESC) AS rn
FROM tips t
)
WHERE rn < 3
ORDER BY day, rn;
output = tips.assign(rn=tips.sort_values(['total_bill'], ascending=False).\
groupby(['day']).cumcount() + 1).\
query('rn < 3').\
sort_values(['day', 'rn'])
七、Update 的使用方式
sql 语句:UPDATE tips SET tip = tip*2 WHERE tip < 2;
output = tips.loc[tips['tip'] < 2, 'tip'] *= 2
八、Delete 的使用方式
sql 语句:DELETE FROM tips WHERE tip > 9;
output = tips = tips.loc[tips['tip'] <= 9]
九、参考文章
Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析的更多相关文章
- 《你还在写sql语句吗?》人生苦短,进入MybatisPlus的丝滑体验
一.发展历程 依稀记得大学期间,类中写sql语句的日子,一个sql语句占据了大部分时间,到后来hibernate的出现算是解决了这一痛点.工作 后,我们又接触到了mybatis这样的框架,瞬间感觉这个 ...
- 写sql语句分别按日,星期,月,季度,年统计
--写sql语句分别按日,星期,月,季度,年统计销售额 --按日 ' group by day([date]) --按周quarter ' group by datename(week,[date]) ...
- (摘至)程序员老鸟写sql语句的经验之谈
做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为 ...
- 程序员老鸟写sql语句的经验之谈
做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为 ...
- 写sql语句注意事项
做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为 ...
- PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别
PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别 在PL/SQL中在执行SQL语句时可以直接写SQL或者可以把一个SQL语句拼成一个字符串,如下: select * fr ...
- 水晶报表使用经验谈--使用sql语句直接生成dataset做为报表的数据源
概述: 上一次自己做了直接在rpt文件里使用oledb连接使用数据库的方法 但是不是很灵活 这次做了使用sql语句直接生成dataset做为报表的数据源(即push模式),这样就可以接受参数了.当然报 ...
- 在mybatis中写sql语句的一些体会
本文会使用一个案例,就mybatis的一些基础语法进行讲解.案例中使用到的数据库表和对象如下: article表:这个表存放的是文章的基础信息 -- ------------------------- ...
- 写sql语句连接的时候注意的一个小细节
我在写权限的查询的时候,用到了sql语句的链接写一下出错的时候的代码 $sqlpid="select auth_name from sw_auth where auth_level=0&qu ...
随机推荐
- 计算机网络 --万维网www
万维网是一个分布式的超媒体系统,客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所需要的万维网文档.万维网必须解决的几个问题:1.怎样标志分布在整个因特网上的万维网文档?答:万维网使用统一的 ...
- memcached系列
memcached系列:http://blog.csdn.net/xingxing513234072/article/category/2462865
- SQLServer中游标实例介绍(转)
引言 我们先不讲游标的什么概念,步骤及语法,先来看一个例子: 表一 OriginSalary 表二 AddSalary 现在有2张表,一张是OriginSal ...
- 用CMakeLists.txt组织工程
1 一个工程会有多个CMakeLists.txt,如何组织这些CMakeLists.txt来构建一个工程? 1.1 最外层一个CMakeLists.txt,是总的CMakeList.txt,在这个里 ...
- Tomcat学习笔记【2】--- Tomcat安装、环境变量配置、启动和关闭
本文主要讲Tomcat的安装和配置. 一 Tomcat安装 1.1 下载 下载地址:http://tomcat.apache.org/ 1.2 安装 Tomcat是不需要安装的,解压压缩包即可. 在安 ...
- ubuntu中设置wireshark抓包
安装wireshark软件后,打开进行抓包的时候会提示权限不足.原因是普通用户没有执行权限,也打不开网络端口捕捉,因为dumpcap需要root权限. 产生这种问题的原因:比如:wireshark在进 ...
- Eclipse使用方法和技巧二十六:浅谈快捷键
网络上到处都是eclipse有哪些经常使用的快捷键,当中还有非常多讲得着实不错.这里就不再狗尾续貂而是谈谈别的这段时间的一些思考.近期增加了开发团队.代码量突突的上去了.同一时候也发现 ...
- phpPHP创建创建jpg格式图片以及压缩图片(转)
其实是因为一些业务上的需求,所以需要对用户上传后的图片进行压缩,因为上传的图片比较大,显示的时候加载起来如果网速不给力的话就很吃力了,而且大图片也浪费空间,于是找了一下相关的资源,主要方法在开源中国上 ...
- PHP生成图片太慢了。。有些都不出来、
现在为了使用不同宽高的图片,做了个动态生成的程序.每次根据图片传入的宽高来输出图片,然后 html 页面里用 <img src="xxx.com/img?src=c8d997dae15 ...
- 原生js基础学习--正则RegExp
转义字符"\" 使用反斜杠之后,会强制的将"\"之后的字符取消掉原来的意思转换成文本, 转义符号不会输出 var str= "abc\"de ...