sql 占比_对比MySQL,学会在Pandas中实现SQL的常用操作

本文说明

我相信你如果学习了Pandas,就一定是想从事数据分析这样一个行业。既然你想从事数据分析行业,那我就默认你肯定是会Sql,即使你现在不会,你以后也要会。

本文初步对比Sql,说明如何使用Pandas中执行各种SQL操作。真的!好像对比起来,学习什么都快了。

bd1b90913bcf8d0dbdf47f866d5939a6.png

本文大纲

c66557e5556f40bf02fb66ffa465002a.png

引入相关库和数据读取

import numpy as npimport pandas as pd
df = pd.read_csv("tips.csv",encoding="gbk")
df.head()

结果如下:

1ed3c09a2efb73ebae7c6d7d8fdf1496.png

1. Select数据查询

在SQL中,选择是使用您要选择的列(用逗号分隔)或(*选择所有列)来完成的。

SELECT '总费用', '小费', '是否吸烟', '吃饭时间'FROM dfLIMIT 5;

对于pandas,通过将列名列表传递给DataFrame来完成列选择。

df[['总费用', '小费', '是否吸烟', '吃饭时间']].head(5)

结果如下:

14546bb1103e116212e9c56bce4fffc4.png

注意:调用不带列名列表的DataFrame将显示所有列(称为SQL的*)。

在SQL中,您可以添加一个计算列

SELECT *, "小费"/"总费用" as "小费占比"FROM dfLIMIT 5;

对于pandas,可以使用DataFrame.assign()的方法追加新列。

df.assign(小费占比=df['小费'] / df['总费用']).head(5)

结果如下:

21ebd2fa93255cf60476b62d7dba5bed.png

2. Where按条件查询

通过WHERE子句在SQL中进行过滤。

SELECT *FROM dfWHERE 吃饭时间 = '晚餐'LIMIT 5;

DataFrame可以通过多种方式进行过滤。最直观的方法是使用布尔索引

df[df['吃饭时间'] == '晚餐'].head(5)

结果如下:

1de66959bcd2cb570a83a44b042f3534.png

上面的语句只是将Series的True / False对象传递给DataFrame,并返回所有带有True的行。

is_dinner = df['吃饭时间'] == '晚餐'
is_dinner.value_counts()
df[is_dinner].head(5)

结果如下:

eba289c667732b0a85a10b66db447a51.png

就像SQL的OR和AND一样,可以使用|将多个条件传递给DataFrame。|(OR)和&(AND)。

SELECT *FROM dfWHERE 吃饭时间 = '晚餐' AND 小费 > 5.00;

那么,在DataFrame代码应该怎么写呢?

df[(df['吃饭时间'] == '晚餐') & (df['小费'] > 5.00)]

结果如下:

6fca1b0d7eab9d1e011e4fd2dc687acf.png

3. in和not in条件查询

我们先来看看在SQL中应该怎么做。

SELECT *FROM dfWHERE 星期几 in (周四,周五)LIMIT 5;

对比到DataFrame中,我们再看看怎么做?

df[df["星期几"].isin(['周四','周五'])].head(5)

结果如下:

2431d9a1f7863834ca52760d61937c30.png

如果是not in,对比到DataFrame中,直接使用取反操作(~)。

df[~df["星期几"].isin(['周四','周五'])].head(5)

结果如下:

c5bcaac2fdb96e583fd15fc81c9aff72.png

4.group by分组统计

在Pandas中,SQL的GROUP BY操作是使用类似命名的groupby()方法执行的。groupby()通常是指一个过程,在该过程中,我们希望将数据集分成多个组,应用某些功能(通常是聚合),然后将各组组合在一起。

常见的SQL操作是获取整个数据集中每个组中的记录数。例如,通过查询可以了解性别留下的提示数量。

SELECT "性别", count(*)FROM dfGROUP BY 性别;

对比到DataFrame中,应该是这样的。

df.groupby('性别').size()

结果如下:

82b5615ec0fd1ee929fe57041fac7eca.png

注意,在pandas代码中我们使用了size()而不是count()。这是因为count()将函数应用于每一列,并返回每一列中的记录数。

df.groupby('性别').count()

结果如下:

fa939399c46931f04143b5e5cf493b0d.png

如果想要使用count()方法应用于单个列的话,应该这样做。(后面需要随意选择一列)

df.groupby('性别')["总费用"].count()

结果如下:

a7c85a6bc56aae91e2e7325cc43b3ca4.png

也可以一次应用多种功能。例如,假设我们要查看小费金额在一周中的各个天之间有何不同--->agg()允许您将字典传递给分组的DataFrame,从而指示要应用于特定列的函数。

在SQL中:

SELECT 星期几, AVG(小费), COUNT(*)FROM dfGROUP BY 星期几;

在Dataframe中:

df.groupby('星期几').agg({'小费': np.mean, '星期几': np.size})

结果如下:

c00dc8b9c4be3818f9004256f63ac9bc.png

通过将一列列传递给方法,来完成按多个列分组groupby()。在SQL中:

SELECT 是否吸烟, 星期几, COUNT(*), AVG(小费)FROM tipsGROUP BY 是否吸烟, 星期几;

在Dataframe中:

df.groupby(['是否吸烟', '星期几']).agg({'小费': [np.size, np.mean]})

结果如下:

7d69694f153ecfaf41bfd469bd21ee8e.png

5.join数据关联

可以使用join()merge()执行JOIN。默认情况下,join()将在其索引上联接DataFrame。每个方法都有参数,可让您指定要执行的联接类型(LEFT,RIGHT,INNER,FULL)或要联接的列(列名或索引)。但是还是推荐使用merge()函数。

1)数据准备
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],'value': [1, 3, 5, 7]})
df2 = pd.DataFrame({'key': ['B', 'D', 'D', 'E'],'value':[2, 4, 6, 8]})

结果如下:

e836c8203106074d891009517c5bfde5.png

假设我们有两个数据库表,它们的名称和结构与我们的DataFrames相同。现在让我们看一下各种类型的JOIN。

2)inner join内连接

在SQL中:

SELECT *FROM df1INNER JOIN df2ON df1.key = df2.key;

在Dataframe中:

pd.merge(df1, df2, on='key')

结果如下:

de2b3cc6a72aa70b687dd14ec5811bc3.png

3)left outer join左连接

在SQL中:

SELECT *FROM df1LEFT OUTER JOIN df2ON df1.key = df2.key;

在Dataframe中:

pd.merge(df1, df2, on='key', how='left')

结果如下:

a51af6ad6ff40f728e483d38f8581fcf.png

4)right join右连接

在SQL中:

SELECT *FROM df1RIGHT OUTER JOIN df2ON df1.key = df2.key;

在Dataframe中:

pd.merge(df1, df2, on='key', how='right')

结果如下:

e10ac191352c38c3b1c94d52ccabfc45.png

5)full join全连接

注意在MySQL中是不支持全连接的,一般是使用union完成这个操作的,这将在下面一个知识点中体现。

在Dataframe中:

pd.merge(df1, df2, on='key', how='outer')

结果如下:

1bab7848df8b3802c9e5fb9316ab89c6.png

6. union数据合并

UNION(ALL)操作在Dataframe中可以使用concat()来执行。

1)数据准备
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]})

结果如下:

16dab099dda345b28a741e4c2d3857dd.png

2)union all不去重合并

在SQL中:

SELECT city, rankFROM df1UNION ALLSELECT city, rankFROM df2;
"""
         city    rank
      Chicago       1
San Francisco      2
New York City      3
      Chicago      1
       Boston      4
  Los Angeles      5
"""

在Dataframe中:

# 默认就是axis=0
pd.concat([df1, df2],axis=0)

结果如下:

c8eb3a34dd35cf262cacc3353d32c396.png

3)union去重合并

在SQL中:

SELECT city, rankFROM df1UNIONSELECT city, rankFROM 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
"""

在Dataframe中:

pd.concat([df1, df2]).drop_duplicates()

结果如下:

cc1639bb933dd92ac6bbd54cc9603652.png

7.取group分组后的Topn

在MySQL8.0以前的版本,可能是不支持窗口函数,因此求Topn可能有些费劲,以前的文章中已经提到过,这里也就没有多余的叙述。

有下面一堆数据,怎么求出Topn呢?

df = pd.DataFrame({"name":["张三","王五","李四","张三","王五","张三","李四","李四","王五"],"subject":["语文","英语","数学","数学","语文","英语","语文","英语","数学"],"score":[95,80,83,80,90,71,88,70,78]})
df

结果如下:

07f46483a0286829440103679b593cae.png在Dataframe中:

df.groupby(["subject"]).apply(lambda df:df.sort_values("score",ascending=True))

结果如下:

5f44c66279188d085cb058dd91a505fc.png  

Python学习交流群 

为了让大家更加即时地沟通学习,我们建了一个Python学习交流群,有想入群的同学,可以添加下面小助手微信,他会拉大家入群哈~

2a1c7e0625176fca0914798adf78475c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pandas一个非常流行的数据分析库,它提供了to_sql函数来将dataframe数据保存到数据库。to_sql函数需要一个连接对象和数据表名称作为参数。 首先,我们需要使用Python的数据库驱动程序来连接数据库,例如MySQL数据库可以使用pymysql库,PostgreSQL可以使用psycopg2库。 接下来,我们需要使用pandas的read_sql函数从数据库读取数据到dataframe,然后做一些数据处理。处理完成后,我们可以使用to_sql函数将dataframe数据保存回数据库。在to_sql函数,我们需要指定数据表的名称,还可以设置查询的模式(append, replace或fail)。 以下是一个简单的例子: ``` import pymysql import pandas as pd # 创建数据库连接 conn = pymysql.connect(host='localhost', user='root', password='123456', database='testdb', port=3306) # 读取数据到dataframe df = pd.read_sql("SELECT * FROM student", conn) # 处理数据 df = df[df['age']>18] # 将数据保存回数据库 df.to_sql(name='student_filtered', con=conn, if_exists='replace', index=False) # 关闭连接 conn.close() ``` 在这个例子,我们首先连接到MySQL数据库,然后使用pandas的read_sql函数从student表读取数据到dataframe。接下来,我们根据age列的值筛选数据。最后,我们使用to_sql函数将筛选后的数据储存在student_filtered表。if_exists参数设置为replace,表示如果表已经存在,则该表会被替换。最后,我们关闭数据库连接。 pandas的to_sql函数简单易用,可以方便地将dataframe数据保存到数据库。如果我们需要频繁地保存dataframe数据到数据库,就需要熟练使用to_sql函数,并对数据库连接有一定的了解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值