【Pandas】基础操作

📝本文介绍
本文为作者观看pandas入门课后整理的基础操作笔记

👋作者简介:一个正在积极探索的本科生
📱联系方式:943641266(QQ)
🚪Github地址:https://github.com/sankexilianhua
🔑Gitee地址:https://gitee.com/Java_Ryson
由于本人的知识所限,如果文章有问题,欢迎大家联系并指出,博主会在第一时间修正。

📕前言

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  January
         1    200  February
         2    300    March
    2019 0    500  January
         1    600  February
         2    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      NaN
              February     200      NaN
              March        300      NaN
    profits   January      NaN     10.0
              February     NaN     20.0
              March        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()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值