Pandas基础使用(机器学习基础)

语言: CN / TW / HK

theme: channing-cyan highlight: agate


「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

前言

终于到了我们三大套件的最后一个套件了Pandas,这个哥们相当牛皮,不管是机器学习还是爬虫数据清洗,再或者是办公都相当帮。所以说这个库我认为其实是每一个pythoner都必须学习的库,因为真的很实用,支持excel,cvs,sql。给你们看一下代码你们就能感受到了 ```python

import pymysql import pandas as pd

con = pymysql.connect(host="127.0.0.1",user="root",password="password",db="Huterox")

读取sql

data_sql=pd.read_sql("SQL查询语句",con)

存储

data_sql.to_csv("test.csv") ```

或者,你直接将sql的表读进去,然后当中pandas的数据结构去操作。 ```python import pandas as pd import pymysql from sqlalchemy import create_engine

con = create_engine('mysql+pymysql://user_name:[email protected]:3306/database_name') data = pd.read_sql_table("table_name", con) data.to_csv("table_name.csv") ``` 所以说,理论上如果你只是想要玩数据操作的话,你甚至可以不需要专门去学习sql(当然最好还是学习的,但如果你是办公人群,只是有特殊需求的话,确实可以考虑)

所以问题来了,竟然它如此强大,那么也就意味着,它的内容较多。我将尽可能地去说明经常使用的内容,最起码在查看别人操作的时候能够看懂。

在学习pandas之前我们必须先了解pandas处理后的数据结构是怎么样的,这样一来我们就能够进行操作。

Pandas的基本数据结构

Series线性结构

这个呢,其实和我们的一维数组其实是类似的。但是它的样子要更加丰富一点。

image.png

image.png

image.png

我们不难发现其实我们的index其实和我们的字典是类似的,但是更加强大的是它可以像列表切片一样。 当然我们也可以像字典一样赋值

image.png

```python import pandas as pd index = ["第{}个数字".format(i) for i in range(1,5)] series = pd.Series([1,2,3,4],index=index,dtype=float) series print(series[0]) print(series["第2个数字"]) print(series[1:3])

```

此外我们还可以修改索引。

```python import pandas as pd index = ["第{}个数字".format(i) for i in range(1,5)] series = pd.Series([1,2,3,4],index=index,dtype=float) series

print(series[0])

print(series["第2个数字"])

print(series[1:3])

index_new = ["第{}个数字New".format(i) for i in range(1,5)] series.index = index_new series.reset_index(drop=True) series ```

但是这里要注意一点,那就是关于 reset_index()

image.png

DataFrame结构

这个结构就和我们的sql表类似了。

image.png

关于它大创建那就其实和我们的Series类似了,只是我们多了一个东西,这个东西就和我们SQL表的字段名一样,没错这就是字段名字。和我们的Excel的字段名是一样的。

image.png

现在我们来简单地创建一张表。

```python import pandas as pd import numpy as np

score = np.random.randint(60, 100, (10, 5))

构造行索引序列

subjects = ["语文", "数学", "英语", "政治", "体育"]

构造列索引序列

stu = ['同学' + str(i) for i in range(1,score.shape[0]+1)]

df = pd.DataFrame(score,columns=subjects,index=stu) df ```

image.png

对DataFrame进行操作

切片

首先我们不难发现就是我们先前是啥,是直接使用字典把值传进去了,所以我们对于它的操作我们也可以这样。

image.png

当然,我们也可以把它当做二维数组来处理,但是我们这里就需要使用到一些操作了。 我们默认是按照列优先的,现在我们要按照索引来。

image.png

image.png

```python import pandas as pd import numpy as np

score = np.random.randint(60, 100, (10, 5))

构造行索引序列

subjects = ["语文", "数学", "英语", "政治", "体育"]

构造列索引序列

stu = ['同学' + str(i) for i in range(1,score.shape[0]+1)]

df = pd.DataFrame(score,columns=subjects,index=stu) print(df.loc["同学1":"同学3"]) print(df.loc["同学1":"同学3"]["语文"]) print(df.iloc[0:3,0:3]) print(df.loc[df.index[0:3],["语文","政治"]]) ```

转置

image.png

排序

对DataFrame

使用df.sort_values(by=, ascending=) 单个键或者多个键进行排序, 参数: by:指定排序参考的键 ascending:默认升序ascending=Ture:

降序 ascending=False:降序

image.png

对两个键排序是指第一个一样比第二个。

对Series排序

这个就没啥好说的了,直接排序。

df["语文"].sort_values(ascending=False)

这个和我们Series是一样的DataFrame本来就是有Series组成的。

```python df=df.sort_values(by=["语文","数学"],ascending=False).head(3)#显示前三个,默认显示前五个

这里注意的是改变之后我们的df需要重新接受

print(df) ```

修改索引

前面我们其实已经说了如何修改,但是这里的话其实都是一样的,只是有些细节要注意。 那就是,我们重新修改设置之后需要重新赋值。

image.png 注意我们这里的话其实也是可以设置多个索引的

image.png

设置为多个索引之后我们管它叫做 MutiIndex。这个其实也是它的一种数据结构,

image.png

但是我把它归为一个DataFrame一起。因为这个其实就是个DataFrame

运算

终于我们到了运算模块,这个还是比较重要的。

逻辑运算

image.png

image.png

统计运算

老师知道这个一定会笑死。

image.png

来我们单独看看数学的平均成绩

image.png

再看看各个科的成绩

image.png

这不比Excel好用,直接读取excel文件,然后一个函数搞定。 (下次数学建模我就用pandas+sklearn/pytorch去玩玩,争取明年干个国奖) 万金油~神经网络(狗头)

那么对应的API如下:

  • min(最小值)
  • max(最大值)
  • mean(平均值)
  • median(中位数)
  • var(方差)
  • std(标准差)
  • mode(众数)

除此之外我们还有累计函数

image.png

有什么用呢,我演示一下,你就知道了。

image.png

这个求经济增长还是很有用的。

自定义运算

现在我们求每一个学科最高分和最低分的差值

image.png

绘图

我们的Pandas里面其实封装了很多关于matplotlib的内容 所以我们其实是可以直接绘图的。

```python import matplotlib.pyplot as plt from pylab import mpl

设置显示中文字体

mpl.rcParams["font.sans-serif"] = ["SimHei"]

设置正常显示符号

mpl.rcParams["axes.unicode_minus"] = False tx1 = df.loc["同学1"] tx1.plot() plt.show()

```

image.png

绘图我们还有不同的样式

DataFrame.plot (kind='line')

有:

line 线

bar 柱状图

barh 横向柱状图

scatter 散点图

等等

image.png

缺失值处理

这个其实很简单,就是有些时候我们的数据会缺失。(一般时读取某写文件的时候)

image.png

  1. isnull判断是否有缺失数据NaN
  2. fillna实现缺失值的填充
  3. dropna实现缺失值的删除
  4. replace实现数据的替换

  5. pd.isnull(df) 为空返回TRUE

  6. pd.notnull(df) 不为空返回TRUE

image.png

例如我们现在对全部的空值进行赋值平均值(覆盖)

```python for i in df.columns: if np.all(pd.notnull(df[i])) == False: print(i) df[i].fillna(df[i].mean(), inplace=True)

df=df.replace(to_replace='?', value=np.nan)替换为?

df = df.dropna() 直接删掉空的

``` 我们使用numpy的all判断

数据离散处理

这个其实没啥,看我的操作就行了,现在我想要对我们的分数段进行划分(对数学) 首先我想均匀分配

image.png

然后统计每个分数段的人数

image.png

我现在想看每个分数段的人数。

image.png

那么这个就是所谓的离散处理。 作用还是蛮大的。

合并数据

终于快到尾声了 合并数据就是合并表嘛。 我这边重新准备了两个数据,df,df1

```python import pandas as pd import numpy as np

score = np.random.randint(60, 100, (10, 5)) score2 = np.random.randint(60, 100, (10, 5))

构造行索引序列

subjects = ["语文", "数学", "英语", "政治", "体育"]

构造列索引序列

stu = ['同学' + str(i) for i in range(1,score.shape[0]+1)]

df = pd.DataFrame(score,columns=subjects,index=stu,dtype=float) df2 = pd.DataFrame(score2,columns=subjects,index=stu,dtype=float) ```

concat 直接合并

这个没啥就是直接合并!当然注意行和列。 我们先看到前三个和后三个

image.png

image.png

image.png

Merge合并

这个就厉害一点了,包括我们数据库里面的内外联都能实现。

不懂这个没关系,咱们有图

result = pd.merge(left, right, on=['key1', 'key2'])

image.png

result = pd.merge(left, right,how="left", on=['key1', 'key2'])

image.png

result = pd.merge(left, right,how="right", on=['key1', 'key2'])

image.png result = pd.merge(left, right,how="outer", on=['key1', 'key2'])

image.png

我这边就随便举个例子了,两个表直接联合

image.png

交叉表

这个呢,其实没啥,给你看你就明白了

image.png

我这里改一下,如果数学分数大于60就为1,反之为0

image.png

image.png

image.png

之后我们美化一下

```python df["数学"]=np.where(df["数学"]>=60,0,1) df["语文"]=np.where(df["语文"]>=60,0,1)

count = pd.crosstab(df["数学"],df["语文"]) sum = count.sum(axis=1) print(count) pro = count.div(sum,axis=0)

print(pro)

pro.plot(kind='bar', stacked=True)#TRUE叠加 plt.show()

```

image.png

分组聚合

我就直接举一个例子,你就懂了 现在假设我是英语老师,我现在想看看,是不是语文不好的,英语也不好

image.png

结果发现可能不是。

读取/保存文件

pandas可以读取多种文件

image.png

image.png

下面我以读取csv文件为例子,读取的是我们昨天那个演示的成人的数据。

image.png

image.png

现在我不想要那么多,我只想要一些,于是我可以这样做。

image.png 之后是写进去

image.png

image.png

image.png

总结

这些基本上都是比较常用的,应付办公问题不大,适当地清洗数据问题也不大。那么接下来就是机器学习的正式内容了。这里我会分两大类,一个是常见机器学习算法,这一块我们基于sklearn。还有一部分是我们的神经网络,也就是深度学习部分,这一部分我们基于pytorch(sklearn也能做,但是pytorch更香)。关于算法的介绍的话,我会大概说说,这个算法大致是怎么样的,然后调用哪些API,怎么玩?(其实基本的机器学习算法还是比较简单的,只是理解使用的话,当然深入研究的话,我本科就能出期刊了,虽然曾经的老班,天天给我们打鸡血 SCI小意思,我带的XX学长都有,很简单的~。但是肯定没那么轻松)