page contents

与MySQL比较,Pandas中实现SQL的常用操作有哪些?

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

attachments-2021-04-V8UD7r9K606586f6c45d9.png

我相信你如果学习了Pandas,就一定是想从事数据分析这样一个行业。既然你想从事数据分析行业,那我就默认你肯定是会Sql,即使你现在不会,你以后也要会。这里推荐:sql和mysql的区别。本文初步对比Sql,说明如何使用Pandas中执行各种SQL操作。真的!好像对比起来,学习什么都快了。


本文大纲

attachments-2021-04-unP9z6vc6065825f65f91.png

引入相关库和数据读取

import numpy as np
import pandas as pd"tips.csv""gbk"df.head()

结果如下:

attachments-2021-04-I3rC2xBi606582bdd0aee.png

 Select数据查询 

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

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

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

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

结果如下:

attachments-2021-04-rVtZrdeG60658344b8e9b.png

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

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

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

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

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

结果如下:

attachments-2021-04-qJqcNZEl6065835b13de0.png

 Where按条件查询 

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

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

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

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

结果如下:

attachments-2021-04-SVvc8eA26065836c75cd5.png

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

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

结果如下:

attachments-2021-04-e8lNGch96065837aba78e.png

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

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

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

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

结果如下:

attachments-2021-04-LwEePCp660658392ec8d0.png

 in和not in条件查询 

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

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

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

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

结果如下:

attachments-2021-04-dQ8R7GLS606583a112c4f.png

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

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

结果如下:

attachments-2021-04-cNyQluCc606583b0ac1cd.png

 group by分组统计 

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

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

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

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

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

结果如下:

attachments-2021-04-40WSgxMJ606584314dd7d.png

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

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

结果如下:

attachments-2021-04-sByl9DS96065844096a4a.png

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

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

结果如下:

attachments-2021-04-kj0wunuI6065845aea487.png

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

在SQL中:

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

在Dataframe中:

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

结果如下:

attachments-2021-04-3LUk5x0x60658474e318a.png

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

在SQL中:

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

在Dataframe中:

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

结果如下:

attachments-2021-04-RxWbiKB1606584b02801a.png

 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]})'key''B' 'D' 'D' 'E''value'2 4 6 8

结果如下:

attachments-2021-04-r3r5PPim606584cf847d4.png

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

2.inner join内连接

在SQL中:

SELECT *
FROM df1
INNER JOIN df2
  ON df1.key = df2.key;

在Dataframe中:

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

结果如下:

attachments-2021-04-sZXv5gRS606584e88dd6d.png

3.left outer join左连接

在SQL中:

SELECT *
FROM df1
LEFT OUTER JOIN df2
  ON df1.key = df2.key;

在Dataframe中:

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

结果如下:

attachments-2021-04-x88tmxX4606584fd2f3a0.png

4.right join右连接

在SQL中:

SELECT *
FROM df1
RIGHT OUTER JOIN df2
  ON df1.key = df2.key;

在Dataframe中:

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

结果如下:

attachments-2021-04-UEWXr9H5606585162234d.png

5.full join全连接

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

在Dataframe中:

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

结果如下:

attachments-2021-04-TDxtD2gG6065852a5e04c.png

 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]})

结果如下:

2.union all不去重合并

在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
"""

在Dataframe中:

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

结果如下:

attachments-2021-04-T4002f2h606585505a1f4.png

3.union去重合并

在SQL中:

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
"""

在Dataframe中:

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

结果如下:

attachments-2021-04-5iOBk2Re60658564a162d.png

 取group分组后的Topn 

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

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

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

结果如下:

attachments-2021-04-cA7QwSh6606585795fd6e.png

在Dataframe中:

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

结果如下:

attachments-2021-04-WdzQXb9X606585a006201.png

更多技术咨询,继续关注:六星社区

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-7Wxpw7w962abde2c0e20a.jpeg


  • 发表于 2021-04-01 16:43
  • 阅读 ( 756 )
  • 分类:数据库

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章