📝本文介绍
本文为作者观看pandas入门课后整理的基础操作笔记
👋作者简介:一个正在积极探索的本科生
📱联系方式:943641266(QQ)
🚪Github地址:https://github.com/sankexilianhua
🔑Gitee地址:https://gitee.com/Java_Ryson
由于本人的知识所限,如果文章有问题,欢迎大家联系并指出,博主会在第一时间修正。
文章目录
- 📕前言
- 📘1. 读取与写入表格
- 📖1.1 读取文件
- 📖1.2 数据类型
- 📙2. DataFrame数据选择
- 📖2.1 选择列
- 📖2.2 数据筛选
- 📗3. 创建图表
- 📕4. 创建新列
- 📖4.1 创建新的一列
- 📖4.2 更改列标签名
- 📘 5. 统计
- 📖5.1 求平均值,中位数等
- 📖5.2 分组统计
- 📙6. 重塑表格布局
- 📖6.1 排序
- 📖6.2 透视表
- 📖6.3 列变行
- 📗7. 合并表
- 📖7.1 拼接表 concat
- 📖7.2 使用共有/相似列连接 merge
- 📕8. 时间序列数据处理
- 📖8.1 文本数据转为时间对象
- 📖8.2 重采样
- 📘9. 文本数据操作
📕前言
Pandas处理的是dataframe的数据。datafram可以理解为键值对,一个键(列名)和其对应底下的多个值的二维数组.
练手数据集:vincentarelbundock.github.io/Rdatasets/datasets.html
本次所使用的数据集为第一个数据集。(并不会全文都使用)
📘1. 读取与写入表格
📖1.1 读取文件
(1)打开CSV文件:变量名 = pd.read_csv(”路径/文件.csv“)
- 路径使用左斜杠/
- (若使用右斜杠)路径前加一个r来表示不要转义
- (若使用右斜杠)可以使用两个右斜杠来表示\
(2)存储Excel文件:变量名.to_excel(“文件名.xlsx”,sheet_name=”passengers“,index=False)
- 通过设置行索引标签不会保存在电子表格中
- 除文件名外,都是可选项
(3)打开excel文件:变量名 = pd.read_excel(”路径/文件.xslx“,sheetname=”passengers“)
- sheetname是可选项
📖1.2 数据类型
-
使用type(变量)来查看变量对应的数据类型。最常用的数据类型即为:pandas.core.frame.dataframe
-
使用 变量.dtypes可以查看其中每一列名对应的数据类型
-
使用 变量.info可以查看更详细的信息
-
使用head()方法可以选择查看前几行
-
使用tail()方法可以选择查看倒数几行
📙2. DataFrame数据选择
📖2.1 选择列
#选择单列
age = affairs['age']; #可以选出对应的列的值来,此时的数据类型为pandas.core.series.Series
age.shape #是一个一维数据#选择多列
gender_age = affairs[['gender','age']] #取出对应的两列数值来
gender_age.shape #是一个二维数据gender_age_children = affairs[['gender','age','children']] #取出对应的三列数值来
gender_age.shape #是一个三维数据
📖2.2 数据筛选
一个表的变量创建之后,对于数据的筛选可以这样理解:[]中包含了所要筛选的条件。如果是一个列名,那么筛选出来的是一列。如果是一个或多个不等式,则可以表示去掉不符合条件的数据。
单条件选择
例:筛选出23岁以上的数据
age_above23 = affairs[affairs['age']>23]# 这里[]里面将age拿出来后进行判断,是否大于23
多条件
筛选出23岁以上45岁以下的数据
age_above23_below45 = affairs[(affairs['age']>23)&(affairs['age']<45)]#注意:多条件时,每一个条件要使用()括起来,条件中间使用& | !等符号来连接
筛选出无缺失值的数据
age_no_na = affairs[affairs['age'].notna()]# 使用.notna()可以判断该列对应的数值中是否有缺失值的行存在
复合型
age_above23 = affairs[affairs['age']>23]['gender']#通过单条件的方式筛选出年龄大于23的数据,再从这些数据中只取性别那一列
可以复合多种筛选方式,来筛选出自己想要的方式。
切片
即筛选出数据中的某些行,列。如:10-25行,2-3列
affair = affairs.iloc[9:25,1:3]#取出第10行到第25行,第2列到3列的数据
iloc[行,列]
📗3. 创建图表
创建图表时,除了使用pandas还需要使用到matplotlib.pyplot
import pandas
import matplotlib.pyplot
air_quality.plot() #默认为line方法
air_quality.plot.area(figsize= (12,4),subplots=True)
plot.show()
plot方法可以实现对数据快速可视化。
-
它也适用于Serial类变量,也就是可以单独对列变量进行可视化
-
默认每一列单独作为不同元素绘制
-
plot中有多种图可以实现,包括line,scatter,box等等。
-
area方法可以将每列的变量单独做一个图。
-
pandas创建的任何绘图对象,都是一个matplotlib对象
📕4. 创建新列
📖4.1 创建新的一列
affairs["新列"] = affais["age"]*2#创建新列直接写即可,但创建完之后需要赋值,后面的赋值可以是表达式也可以是一个简单的值
#其会默认加再DataFrame原数据的最后一列
📖4.2 更改列标签名
特定列标签名更改
affairs_renamed = affairs.rename(columns={"age":"年龄""gender":"性别"}
)# 在columns中使用字典的方式将想要改变的列名更改。
# 即:“原列名”:“新列名”
📘 5. 统计
📖5.1 求平均值,中位数等
-
求单列的平均值:affairs[“列名”].mean()
-
求多列的平均值:affairs[“列名1”,“列名2”].mean()
-
聚合统计信息:describe()
显示的数据包含:总数,平均值,标准差,最小值,25%,50%,75%,max
函数 | 作用 |
---|---|
mean() | 求平均值 |
sum() | 求和 |
count() | 计数 |
median() | 求中位数 |
quantile() | 求分位数 |
max()/min() | 求最大/小值 |
var()/std() | 求方差/标准差 |
agg函数可以对数据进行聚合处理,可以一次性对多个数据的统计
titanic.agg({"Age": ["min","max","median","skew"],"Fare": ["min","max","median","mean"]}
)
📖5.2 分组统计
单分组
例:
affairs[['age','gender']].groupby("gender").mean()
affairs.groupby("gender")["age"].mean()#两种方法都可以求得:按性别分组的年龄平均值
多分组
例:
affairs.groupby(["gender","education"])["age"].mean()affairs.groupby(["gender","education"])["age"].count()#先通过gender来分组,再通过education来分组,分完组后,求各个组的年龄的平均值/总数
📙6. 重塑表格布局
📖6.1 排序
索引排列:sort_index()
值排列:sort_values(by=“列名”)
- 默认为升序排列
- 多排序参数时,需要使用[]将参数括起来
titanic.sort_values(by="Age").head()#降序排列,需要在参数中将ascending=False
titanic.sort_values(by="Age", ascending=False).head()#多参数
titanic.sort_values(by=["Pclass","Age"], ascending=False).head()
📖6.2 透视表
可以理解为:取出数据创建自己子集
pivot和pivot_table
DataFrame.pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='All',observed=False,sort=True)data -- DataFrame格式数据
values -- 需要汇总计算的列,多个需要使用[]括起来
index -- 行分组键,多个需要使用[]括起来
columns -- 列分组键,多个需要使用[]括起来
aggfunc -- 聚合函数,或函数列表,默认为平均值
fill_value -- 缺失值填充,默认值填充
margins -- 是否添加行列的总计
dropna -- 如果列的值都为NaN则不计算
margins_name -- 汇总行列名称
observed -- 是否显示观测值
pivot()函数,取出图集中的部分数据,并将其绘制成子表
Pandas.pivot(data, index=None, columns=None, values=None)no2_subset.pivot(columns="location", values="value")#此时,新表的列名将会使用location中的类别
#每个列对应下来的值是原表中value列的值
注意:pandas.pivot
的重点在于 reshape
, 合并同类项,所以在行与列的交叉点值的索引应该是唯一值,如果不是唯一,则会报错
reset_index()可以实现对数据行标签的重新设定
📖6.3 列变行
melt函数默认情况下会将所有其他列(除了 id_vars 中指定的列)转换为行。
df_wide.melt( id_vars=[], #要保留的列value_vars=[], #需要被转换的列名var_name='', #自定义设置对应的列名value_name='' #自定义设置对应的列名
)
melt是pivot的反向
📗7. 合并表
📖7.1 拼接表 concat
使用concat可以沿着一个轴方向将两个表拼接起来,默认情况下是沿着行垂直向下方向,这就要求两个表要有相似的结构
concat([表1,表2,...],axis=0/1)轴axis0沿着行垂直向下方向
轴axis1沿着列水平方向
其还有level,key,names参数
实例数据:
df1 = pd.DataFrame({'sales': [100, 200, 300], 'month': ['January', 'February', 'March']})
df2 = pd.DataFrame({'profits': [10, 20, 30], 'month': ['January', 'February', 'March']})
-
‘levels’ 参数是指在合并多个 DataFrame 时,指定它们的 MultiIndex 层级。具体来说,如果您要将两个具有相同的 MultiIndex 层的DataFrame 进行合并,则需要指定 ‘levels’ 参数。
如:
df_concat = pd.concat([df1, df2], levels=['month'], sort=False) 合并完后:sales profits month January 100 10 February 200 20 March 300 30
-
‘keys’ 参数可以用于向合并后的 DataFrame 添加一层 MultiIndex。当合并多个 DataFrame 时,’keys’ 参数用于识别每个 DataFrame 的来源。
df_concat = pd.concat([df1, df2], keys=['2018', '2019'], sort=False)sales month 2018 0 100 January1 200 February2 300 March 2019 0 500 January1 600 February2 700 March
-
‘names’ 参数用于为 MultiIndex 层级命名。具体来说,’names’ 参数可以为 ‘levels’ 参数中指定的每个层级命名,也可以为使用 ‘keys’ 参数添加的每个层级命名。
df_concat = pd.concat([df1, df2], keys=['sales', 'profits'], levels=[['sales', 'profits'], ['month']], names=['indicator', 'period'], sort=False)sales profits indicator period sales January 100 NaNFebruary 200 NaNMarch 300 NaN profits January NaN 10.0February NaN 20.0March NaN 30.0
📖7.2 使用共有/相似列连接 merge
merge,使用公共标识符连接表。
在有两个表的情况下:
使用两个表共有的列来连接两个表
merge([表1,表2,...],how="",on="")#how有left和right,即左连接和右连接,按左/右标签作为标准,右/左边有的才能连接
#on则是使用哪个共同列
使用两个表相似列来连接(列名可能不同)
merge([表1,表2,...],how="",left_on="",right_on=“”)#how有left和right,即左连接和右连接,按左/右标签作为标准,右/左边有的才能连接
#left_on、right_on是指使用两个表各自的哪个列来合并(列名可能不同)
📕8. 时间序列数据处理
📖8.1 文本数据转为时间对象
pd.to_datatime()可以将数据表中的某一列对应转成时间对象
air_quality["datatime"]=pd.to_datatime(air_quality["datatime"])
-
转换成时间对象之后,可以使用对应的时间函数,最大值,最小值,排序等等。
-
计算两者相差多少小时时,可以直接进行加减运算。
-
通过.dt.month/year/day等可以直接获得年月日信息,通过weekday可以直接分出每个数据是星期几。这些都需要通过dt来访问
-
转为时间对象之后,可以直接使用时间来进行切片
no_2["2019-05-20":"2019-05-21"]
📖8.2 重采样
resample()函数可以将时间序列重采样到另一个频率(如:将秒级数据转换为5分钟数据)
使用方法类似与groupby
- 通过使用一个字符串,如M,SH等来定义目标频率
- 需要一个聚合函数
📘9. 文本数据操作
str访问器中有很多专门用于字符串的方法。
- 将所有姓名转换成小写:str.lower()
- 分割:str.split()
- 获取:str.get()
- 是否包含:str.contains(),该函数支持正则表达式
- 长度:str.len()
- 替换:str.replace()