前言Pandas的基本数据结构
Series线性结构Dataframe结构 对Dataframe进行 *** 作
切片转置排序
逻辑运算统计运算自定义运算 绘图缺失值处理数据离散处理合并数据
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:password@127.0.0.1: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 直接合并
这个没啥就是直接合并!当然注意行和列。
我们先看到前三个和后三个
这个就厉害一点了,包括我们数据库里面的内外联都能实现。
不懂这个没关系,咱们有图
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学长都有,很简单的~。但是肯定没那么轻松)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)