一篇博文教你玩转pandas,轻松应付办公场景(机器学习基础)

一篇博文教你玩转pandas,轻松应付办公场景(机器学习基础),第1张

一篇博文教你玩转pandas,轻松应付办公场景(机器学习基础)

文章目录

前言Pandas的基本数据结构

Series线性结构Dataframe结构 对Dataframe进行 *** 作

切片转置排序

对Dataframe对Series排序修改索引 运算

逻辑运算统计运算自定义运算 绘图缺失值处理数据离散处理合并数据

concat 直接合并Merge合并 交叉表分组聚合 读取/保存文件总结
「这是我参与2022首次更文挑战的第5天,活动详情查看: 2022首次更文挑战」
本博文优先在掘金社区发布!

前言

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

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的数据结构去 *** 作。

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其实和我们的字典是类似的,但是更加强大的是它可以像列表切片一样。
当然我们也可以像字典一样赋值

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

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

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的字段名是一样的。

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

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进行 *** 作 切片

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

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

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组成的。

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的内容
所以我们其实是可以直接绘图的。

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判断是否有缺失数据NaNfillna实现缺失值的填充dropna实现缺失值的删除replace实现数据的替换
    pd.isnull(df) 为空返回TRUEpd.notnull(df) 不为空返回TRUE

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

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

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

之后我们美化一下

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学长都有,很简单的~。但是肯定没那么轻松)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5720355.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存