Pandas基础使用(机器学习基础)
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线性结构
这个呢,其实和我们的一维数组其实是类似的。但是它的样子要更加丰富一点。
我们不难发现其实我们的index其实和我们的字典是类似的,但是更加强大的是它可以像列表切片一样。 当然我们也可以像字典一样赋值
```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()
DataFrame结构
这个结构就和我们的sql表类似了。
关于它大创建那就其实和我们的Series类似了,只是我们多了一个东西,这个东西就和我们SQL表的字段名一样,没错这就是字段名字。和我们的Excel的字段名是一样的。
现在我们来简单地创建一张表。
```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 ```
对DataFrame进行操作
切片
首先我们不难发现就是我们先前是啥,是直接使用字典把值传进去了,所以我们对于它的操作我们也可以这样。
当然,我们也可以把它当做二维数组来处理,但是我们这里就需要使用到一些操作了。 我们默认是按照列优先的,现在我们要按照索引来。
```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],["语文","政治"]]) ```
转置
排序
对DataFrame
使用df.sort_values(by=, ascending=) 单个键或者多个键进行排序, 参数: by:指定排序参考的键 ascending:默认升序ascending=Ture:
降序 ascending=False:降序
对两个键排序是指第一个一样比第二个。
对Series排序
这个就没啥好说的了,直接排序。
df["语文"].sort_values(ascending=False)
这个和我们Series是一样的DataFrame本来就是有Series组成的。
```python df=df.sort_values(by=["语文","数学"],ascending=False).head(3)#显示前三个,默认显示前五个
这里注意的是改变之后我们的df需要重新接受
print(df) ```
修改索引
前面我们其实已经说了如何修改,但是这里的话其实都是一样的,只是有些细节要注意。 那就是,我们重新修改设置之后需要重新赋值。
注意我们这里的话其实也是可以设置多个索引的
设置为多个索引之后我们管它叫做 MutiIndex。这个其实也是它的一种数据结构,
但是我把它归为一个DataFrame一起。因为这个其实就是个DataFrame
运算
终于我们到了运算模块,这个还是比较重要的。
逻辑运算
统计运算
老师知道这个一定会笑死。
来我们单独看看数学的平均成绩
再看看各个科的成绩
这不比Excel好用,直接读取excel文件,然后一个函数搞定。 (下次数学建模我就用pandas+sklearn/pytorch去玩玩,争取明年干个国奖) 万金油~神经网络(狗头)
那么对应的API如下:
- min(最小值)
- max(最大值)
- mean(平均值)
- median(中位数)
- var(方差)
- std(标准差)
- mode(众数)
除此之外我们还有累计函数
有什么用呢,我演示一下,你就知道了。
这个求经济增长还是很有用的。
自定义运算
现在我们求每一个学科最高分和最低分的差值
绘图
我们的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()
```
绘图我们还有不同的样式
DataFrame.plot (kind='line')
有:
line 线
bar 柱状图
barh 横向柱状图
scatter 散点图
等等
缺失值处理
这个其实很简单,就是有些时候我们的数据会缺失。(一般时读取某写文件的时候)
- isnull判断是否有缺失数据NaN
- fillna实现缺失值的填充
- dropna实现缺失值的删除
replace实现数据的替换
pd.isnull(df) 为空返回TRUE
- pd.notnull(df) 不为空返回TRUE
例如我们现在对全部的空值进行赋值平均值(覆盖)
```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判断
数据离散处理
这个其实没啥,看我的操作就行了,现在我想要对我们的分数段进行划分(对数学) 首先我想均匀分配
然后统计每个分数段的人数
我现在想看每个分数段的人数。
那么这个就是所谓的离散处理。 作用还是蛮大的。
合并数据
终于快到尾声了 合并数据就是合并表嘛。 我这边重新准备了两个数据,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 直接合并
这个没啥就是直接合并!当然注意行和列。 我们先看到前三个和后三个
Merge合并
这个就厉害一点了,包括我们数据库里面的内外联都能实现。
不懂这个没关系,咱们有图
result = pd.merge(left, right, on=['key1', 'key2'])
result = pd.merge(left, right,how="left", on=['key1', 'key2'])
result = pd.merge(left, right,how="right", on=['key1', 'key2'])
result = pd.merge(left, right,how="outer", on=['key1', 'key2'])
我这边就随便举个例子了,两个表直接联合
交叉表
这个呢,其实没啥,给你看你就明白了
我这里改一下,如果数学分数大于60就为1,反之为0
之后我们美化一下
```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()
```
分组聚合
我就直接举一个例子,你就懂了 现在假设我是英语老师,我现在想看看,是不是语文不好的,英语也不好
结果发现可能不是。
读取/保存文件
pandas可以读取多种文件
下面我以读取csv文件为例子,读取的是我们昨天那个演示的成人的数据。
现在我不想要那么多,我只想要一些,于是我可以这样做。
之后是写进去
总结
这些基本上都是比较常用的,应付办公问题不大,适当地清洗数据问题也不大。那么接下来就是机器学习的正式内容了。这里我会分两大类,一个是常见机器学习算法,这一块我们基于sklearn。还有一部分是我们的神经网络,也就是深度学习部分,这一部分我们基于pytorch(sklearn也能做,但是pytorch更香)。关于算法的介绍的话,我会大概说说,这个算法大致是怎么样的,然后调用哪些API,怎么玩?(其实基本的机器学习算法还是比较简单的,只是理解使用的话,当然深入研究的话,我本科就能出期刊了,虽然曾经的老班,天天给我们打鸡血 SCI小意思,我带的XX学长都有,很简单的~。但是肯定没那么轻松)
- 还在调API写所谓的AI“女友”,唠了唠了,教你基于python咱们“new”一个(深度学习)
- Java前后端分离实战Auto2.0用户登录注册--基本的用户登录 邮箱验证
- 卡尔曼滤波器(目标跟踪一)(上)
- 手把手教你如何自制目标检测框架(从理论到实现)
- 基于Python深度图生成3D点云
- Pandas基础使用(机器学习基础)
- CEC2017基础函数说明Python版本
- 全国空气质量爬取实战
- 智能算法集成测试平台V0.1实战开发
- DDPG神经网络实战(基于强化学习优化粒子群算法)
- 关于强化学习优化粒子群算法的论文解读(全)
- 关于强化学习优化粒子群算法的论文解读(上)
- 基于多种群机制的PSO算法(优化与探索三 *混合种群思想优化多种群与广义PSO求解JSP)
- 基于多种群机制的PSO算法Python实现(优化与探索二)
- 基于多种群机制的PSO算法Python实现
- 520桌面手势告白
- 嘿~瞎话一下,为啥要用Sigmoid?!