mysql和pandas对比_对比MySQL,教你在Pandas中实现SQL常用操作!

原标题:对比MySQL,教你在Pandas中实现SQL常用操作!

黄伟呢 | 作者

数据分析与统计学之美 | 来源

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

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

1

本文大纲

e16b8e34085578f3027002b8a61291f5.png

2

引入相关库和数据读取

importnumpy asnp

importpandas aspd

df = pd.read_csv( "tips.csv",encoding= "gbk")

df.head

结果如下:

11b498ceecece11f1a0bd3983371f28f.png

Select数据查询

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

SELECT'总费用', '小费', '是否吸烟', '吃饭时间'

FROMdf

LIMIT5;

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

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

结果如下:

d2f558c9578729c3b3aca34b00ee9249.png

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

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

SELECT*, "小费"/ "总费用"as"小费占比"

FROMdf

LIMIT5;

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

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

结果如下:

a5dcb4d18cf40685d202cb0c4ad0859a.png

Where按条件查询

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

SELECT*

FROMdf

WHERE吃饭时间 = '晚餐'

LIMIT5;

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

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

结果如下:

56a0065368e346f4e5b799d5ae14a642.png

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

is_dinner= df[ '吃饭时间'] == '晚餐'

is_dinner.value_counts

df[is_dinner].head( 5)

结果如下:

be08811a7e4913ed437439e62edc9a33.png

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

SELECT*

FROMdf

WHERE吃饭时间 = '晚餐'AND小费 > 5.00;

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

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

结果如下:

2f8f9caff349773a5e1736f95d8be99c.png

in和not in条件查询

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

SELECT*

FROMdf

WHERE星期几 in(周四,周五)

LIMIT5;

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

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

结果如下:

9cd14b16246a383b9569d723733a3a99.png

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

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

结果如下:

37c52bf66dca65579ea1c57bafecb1f1.png

group by分组统计

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

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

SELECT"性别", count(*)

FROMdf

GROUPBY性别;

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

df.groupby( '性别') .size

结果如下:

004a674f61dc499b8283add8b9141052.png

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

df.groupby( '性别') .count

结果如下:

442713a48469894c6f86be666773a538.png

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

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

结果如下:

026fde5a4815cdd082dd425e01db927b.png

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

在SQL中:

SELECT星期几, AVG(小费), COUNT(*)

FROMdf

GROUPBY星期几;

在Dataframe中:

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

结果如下:

e46a24000866def0a39292bf971c0676.png

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

在SQL中:

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

FROMtips

GROUPBY是否吸烟, 星期几;

在Dataframe中:

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

结果如下:

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

df2 = pd.DataFrame({ 'key': [ 'B', 'D', 'D', 'E'],

'value':[ 2, 4, 6, 8]})

结果如下:

c0a336b5f962a468d259e2c84b897be4.png

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

2.inner join内连接

在SQL中:

SELECT*

FROMdf1

INNERJOINdf2

ONdf1.key = df2.key;

在Dataframe中:

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

结果如下:

7aee78e86db9862eab0739f29978c7b2.png

3.left outer join左连接

在SQL中:

SELECT*

FROMdf1

LEFTOUTERJOINdf2

ONdf1.key = df2.key;

在Dataframe中:

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

结果如下:

809d1b52694bee1a7f4308716799092d.png

4.right join右连接

在SQL中:

SELECT*

FROMdf1

RIGHTOUTERJOINdf2

ONdf1.key = df2.key;

在Dataframe中:

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

结果如下:

ed4b5a4d4a943648be9f32ddc9ce80aa.png

5.full join全连接

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

在Dataframe中:

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

结果如下:

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

结果如下:

98add9a9797407a14e81588f5f721923.png

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)

结果如下:

c19b9363ffc10f1b11f6d0c4f4e1b3fe.png

3.union去重合并

在SQL中:

SELECT city, rank

FROM df1

UNION

SELECT city, rank

FROM df2;

-- notice that there isonly 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

结果如下:

7a49d86b2d63c7a52c4000ddbafd0ec0.png

取group分组后的Topn

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

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

df = pd.DataFrame({ "name":[ "张三", "王五", "李四", "张三", "王五", "张三", "李四", "李四", "王五"],

"subject":[ "语文", "英语", "数学", "数学", "语文", "英语", "语文", "英语", "数学"],

"score":[ 95, 80, 83, 80, 90, 71, 88, 70, 78]})

df

结果如下:

b5df90e31771630d378820097b58b1b5.png

在Dataframe中:

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

结果如下:

0b049b574203375ec9479ecfa4ece185.png

本文为转载分享&推荐阅读,若侵权请联系后台删除返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值