【学习笔记】《深入浅出Pandas》第4章:Pandas基础操作

本文详细介绍了Pandas中数据的索引操作,包括认识、建立、重置和修改索引,以及不同类型的索引。此外,还涵盖了数据的基本信息、统计计算和位置计算,如描述统计、位置差值、位置移动和排序。数据选择部分讲解了如何通过切片、.loc和.iloc等方法选取数据。文章最后讨论了数据信息的获取,如查看样本、数据形状、数据类型等。
摘要由CSDN通过智能技术生成

4.1 索引操作

4.1.1 认识索引

在这里插入图片描述

  • 行索引是数据的索引,列索引指向的是一个Series;
  • DataFrame的索引也是系列形成的Series的索引;

4.1.2 建立索引

建立索引可以在数据读取加载中指定索引(name):在这里插入图片描述
name已经成为索引了,在显示时已经不与其他列名在一行了,而是单独占据一行。
如果加载时没有指定索引,可以使用df.set_index()指定,该方法并没有修改原来的df变量中的内容,如果希望用设置后的数据替换原来的df变量中的数据,可以直接赋值或者传入inplace参数:

df = pd.read_excel(data) # 读取数据不设置索引
df.set_index('name') # 设置索引
df.set_index(['name', 'team']) # 设置两层索引
df.set_index([df.name.str[0], 'name']) # 将姓名的第一个字母和姓名设置为索引

df = df.set_index('name') # 赋值
df.set_index('name', inplace=True)

# 可以将一个Series指定为索引
s = pd.Series([i for i in range(100)])
df.set_index(s) # 指定一个索引
df.set_index([s, 'name']) # 同时指定索引和现有字段
df.set_index([s, s**2]) # 计算索引

df.set_index('month', drop=False) # 保留原列
df.set_index('month', append=True) # 保留原来的索引

4.1.3 重置索引

df.reset_index():取消已有索引。

df.reset_index() # 清除索引
df.set_index('month').reset_index() # 相当于什么也没做

# 删除原索引,month列没了
df.set_index('month').reset_index(drop=True)
df2.reset_index(inplace=True) # 覆盖使生效

df.set_index(['month', 'year']).reset_index(level=1) # 取消一级索引level
df2.set_index(level='class') # 使用层级索引名
df.reset_index(level='class', col_level=1) # 列索引
df.reset_index(level='class', col_level=1, col_fill='species') # 不存在层级名称的填入指定名称

4.1.4 索引类型

(1)数字索引:

  • RangeIndex:单调整数范围的不可变索引
  • Int64Index:64位整型索引
  • UInt64Index:无符号整数索引
  • Float64Index:64位浮点型索引

(2)类别索引:类别只能包含有限数量的(通常是固定的)可能值(类别)。
(3)间隔索引:代表每个数据的数值或者时间区间,一般应用于分箱。
在这里插入图片描述
(4)多层索引:多个层次且有归属关系的索引。
在这里插入图片描述
(5)时间索引:时序数据的时间。

# 从一个日期连续到另一个日期
pd.date_range(start='1/1/2018', end='1/08/2018')
# 指定开始时间和周期
pd.date_range(start='1/1/2018', periods=8)
# 以月为周期
pd.date_range(start='2017-01-01', end='2018-01-01', freq='M')
# 周期嵌套
pd.date_range(start=pd.Period('2017Q1', freq='Q'), 
			  end=pd.Period('2017Q2', freq='Q'), freq='M')

(6)时间差索引:代表时间长度的数据。

pd.TimedeltaIndex(data = ['06:05:01.000030', '+23:59:59.999999',
						  '22 day 2 min 3us 10ns', '+23:29:59.999999',
						  '+12:19:59.999999'])
# 使用datetime
pd.TimedeltaIndex(['1 days', '1 days, 00:00:05', 
				   np.timedelta64(2, 'D'),
				   datetime.timedelta(days=2, seconds=2)])

(7)周期序列:一定频度的时间。

t = pd.period_range('2020-5-1 10:00:05', periods=8, freq='S')
pd.PeriodIndex(t, freq='S')

4.1.5 索引对象

行和列的索引在Pandas里是一个Index对象,创建一个Index对象的方法如下:

pd.Index([1, 2, 3])
pd.Index(list('abc'))
pd.Index(['e', 'd', 'a', 'b'], name='something')

索引对象可以传入构建数据和读取数据的操作中。

4.1.6 索引的属性

df.index.name # 名称
df.index.array # array数组
df.index.dtype # 数据类型
df.index.shape # 形状
df.index.size # 元素数量
df.index.values # array数组

df.index.empty # 是否为空
df.index.is_unique # 是否不重复
df.index.names # 名称列表
df.index.is_all_dates # 是否全是日期时间
df.index.has_duplicates # 是否有重复值

4.1.7 索引的操作

# 常用
df.index.astype('int64') # 转换类型
df.index.isin() # 是否存在
df.index.rename('number') # 修改索引名称
df.index.nunique() # 不重复值的数量
df.index.sort_values(ascending=False,) # 排序,倒序
df.index. map(lambda x:x+' ') # map函数处理
df.index.str.replace(' ', '') # str替换
df.index.str.split('_') # 分隔
df.index.to_list() # 转为列表
df.index.to_frame(index=False, name='a') # 转换成DataFrame
df.index.to_series() # 转为series
df.index.to_numpy() # 转为numpy
df.index.unique() # 去重
df.index.value_counts() # 去重及计数
df.index.where(df.index=='a') # 筛选
df.index.rename('grade', inplace=False) # 重命名索引
df.index.rename(['species', 'year']) # 多层,重命名索引
df.index.max()
df.index.argmax() # 最大索引值
df.index.any() 
df.index. all()
df.index.T # 转置

其它不常用但很重要的操作不作列出。

4.1.8 索引重命名

将一个数据列置为索引后,就不能像修改列名那样修改索引的名称了,需要使用df.rename_axis方法。它不仅可以修改索引名,还可以修改列名。
注意:修改的是索引名称,不是索引或者列名本身。

s.rename_axis("student_name") # 索引重命名
df.rename_axis(["dow", "hr"]) # 多层索引修改索引名
df.rename_axis('info', axis="columns") # 修改列索引名
df.rename_axis(index={'a': A, 'b': B}) # 修改多层行索引名
df.rename_axis(columns={'name': 's_name', 'b': B}) # 修改多层列索引名
df.rename_axis(columns=str.upper) # 列索引名变大写

4.1.9 修改索引内容

用来修改行和列的索引名的主要函数是df.rename和df.set_axis。
df.rename可以给定一个字典,键是原名称,值是想修改的名称,还可以传入一个与原索引等长度序列进行覆盖修改,用一个函数处理原索引名。

# 修改列索引
df.rename(columns={"A": "a", "B": "c"})
df.rename(str.lower, axis='columns')

# 修改行索引 
df.rename(index={0: "x", 1: "y", 2: "z"}) 
df.rename({1: 2, 2: 4}, axis='index')

# 修改数据类型
df.rename(index=str)

df.set_axis可以将所需的索引分配给给定的轴,通过分配类似列表或索引的方式来更改列标签或行标签的索引。

df.set_axis(['a', 'b', 'c'], axis='index') # 修改索引
df.set_axis(list('abcd'), axis=1) # 修改列名
df.set_axis(['a', 'b'], axis=columns, inplace=True) # 使修改生效
df.set_axis(pd.Index(list('abcde')), axis=0)

4.2 数据的信息

本节介绍DataFrame的基础信息和统计性信息。

4.2.1 查看样本

df.head() # 前部数据, 默认5条,可指定条数
df.tail() # 尾部数据,默认5条,可指定条数
df.sample() # 一条随机数据,可指定条数

4.2.2 数据形状

df.shape # 返回元组,第一个元素代表行数,第二个元素代表列数

4.2.3 基础信息

df.info # 显示所有数据的类型、索引情况、行列数、各字段数据类型、内存占用等

4.2.4 数据类型

df.type # 返回每个字段的数据类型及DataFrame整体类型
s.dtype # Series

4.2.5 行列索引内容

df.axes # 返回一个列内容和行内容组成的列表[列索引, 行索引]
s.axes # Series显示列索引

4.2.6 其他信息

df.index # 索引对象
df.columns # 列索引
df.values # array
df.ndim # 维度数
df.size # 总共有多少数据 行*列
df.empty # 是否为空,有空值不认为是空
df.keys() # Series的索引,DataFrame的列名

#Series独有方法
s.name # 索引名
s.array # 值组成的数组
s.dtype # 类型
s.hasnans

4.3 统计计算

4.3.1 描述统计

df.describe 
# 返回一个有多行的所有数字列的统计表
# 如果没有数字,则输出与字符相关的统计数据
# 支持对时间数据的描述性统计
# 可以指定分位数,指定和排除数据类型

4.3.2 数学统计

# 计算平均,仅对数字类型的列起作用
df.mean() # 生成Series
s.mean() # 生成定值

# 按行计算平均
df.mean(axis='columns')
df.mean(axis=1)
df.mean(1)

4.3.3 统计函数

df.mean() # 返回所有列的均值
df.mean(1) # 返回所有行的均值
df.corr() # 返回列与列之间的相关系数
df.count() # 返回每一列中的非空值个数
df.max() # 每列的最大值
df.min()
df.abs() # 绝对值
df.median() # 中位数
df.std()
df.var() # 无偏方差

df.sum(0, skipna=False) # 不排除缺失数据
df.sum(level='blooded') # 索引级别
df.sum(level=0) 
df.sum(min_count=1) # 执行加法操作所需的最小有效值数 

4.3.4 非统计计算

df.all() # 返回所有列all值的Series
df.any()

# 四舍五入
df.round(2) # 指定字段指定保留小数位
df.round({'Q1':2, 'Q2': 0})
df.round(-1) # 保留10位

# 每个列的去重值的数量
df.nunique()
s.nunique() # 本列的去重值

# 真假检测
df.isna() # 真假替换
df.notna() # 与上相反

Series专有函数:

# 不重复的值及数量
s.value_count()
s.value_counts(normalize=True) # 重复值的频率
s.value_counts(sort=False) # 不按频率排序
s.unique() # 去重
s.is_unique # 是否有重复

# 最大最小值
s.nlargest() # 默认5个,可指定
s.nsmallest()

s.pct_change() # 计算与前一行变化的百分比
s.pct_change(periods=2) # 前两行

s1.cov(s2) # 两个序列的协方差

4.4 位置计算

4.4.1 位置差值diff()

df.diff():可以做位移差操作,计算一个序列数据中上一个数据和下一个数据的差值,如增量研究。

  • 没有被减数的结果为NaN。
  • diff()可以传入数值规定移动多少位,负数则代表移动方向相反。
  • Series类型如果是非数字会报错,DataFrame会对所有数字列移动计算,同时不允许有非数字类型。
  • 对于DataFrame,还可以传入axis=1进行左右移动(默认axis=0)。
    在这里插入图片描述

4.4.2 位置移动shift()

shift():对数据进行移位,不作任何计算,也支持上下移动,移动后目标位置的类型无法接收的为NaN。
可以传入数值规定移动多少位,正数下移,负数上移。
axis=+,右移;axis=-,左移。

4.4.3 位置序号rank()

rank():生成数据的排序值,替换原来的数据值。支持对所有类型数据进行排序,英文按照字母顺序。
参数:

  • axis=1, 横向排名(即Q1-Q4的排名)
  • pct=True,将序数转化成0-1的数。
  • method,指定排序过程中遇到相同值的序数计算方法,可取的值有以下几种:
    • average:序号的平均值。eg:并列第一名,则序号为(1+2)/2=1.5,下个数据为3。
    • min:最小的序号。eg:并列第一名,则序号都为1,下个数据为3。
    • max:最大的序号。eg:并列第一名,则序号都为1,下个数据为2。
    • first。eg:并列第一名,则都显示1,下个数据为2。
    • dense:按照索引的先后显示。
  • na_option=‘botton’,如果遇到空值,则把空值放在最后。
    在这里插入图片描述

4.5 数据选择

在这里插入图片描述

4.5.1 选择列

# 以下方法都可以取一列数据,返回本列的Series
df['name']
df.name

4.5.2 切片[ ]

切片可以选择部分行的数据,但是不支持仅索引一条数据:

df[:2] # 前两行数据
df[4:10]
df[:] # 所有数据,一般不这么使用
df[:10:2] # 按步长取
df[::-1] # 反转顺序

切片不包括右边的索引值。如果切片里是列名组成的列表,则可以起到筛选列的作用。
注意:列表中如果只有一列,返回的也是DataFrame:

df[['name']] # 列表,选择一列,返回DataFrame
df['name'] # 只有一列,返回Series

4.5.3 按轴标签.loc

df.loc的格式:df.loc[<行表达式>, <列表达式>]。
如果列表达式部分不传,将返回所有列。
Series仅支持行表达式进行索引的部分。
loc操作通过索引和列的条件筛选出数据,如果仅返回一条数据,则类型为Series。
在这里插入图片描述
(1)单个索引:

df.loc[0] # 选择索引为0的行

df.set_index(['name']).loc['Ben'] # 索引为name

(2)列表组成的索引:

df.loc[0, 5, 10] # 指定索引为0510的行
df.set_index('name').loc[['Eli', 'Ben']] # 两位学生
df.loc[[False, True]*50] # 为真的列显示,隔一个显示一个

(3)带标签的切片(包括起始和停止):

df.loc[0:5] # 0-5行,包括5
df.loc['2010': '2014'] # 如果索引是时间,可以用字符查询
df.loc[:] # 所有
# 本方法支持Series

(4)附带列筛选,则必须有行筛选。

4.5.4 按数字索引.iloc

df.iloc(<行表达式>, <列表达式>),只可以使用数字索引进行筛选,其他方面相同。

4.5.5 取具体值.at/.iat

df.at[<索引>, <列名>]。
如果是Series,可以直接通过索引取得该索引的值。

# 索引是字符,带引号
df.at[4, 'Q1'] # 65
df.set_index('name').at['Ben', 'Q1'] # 索引是name

# 指定列的值对应其他列的值
df.set_index('name').team.at['Eorge'] 

iat和iloc一样,只支持数字索引。

4.5.6 获取数据.get

df.get(key, default=None):如果无值,则返回默认值;如果是DataFrame,key需要传入列名,返回此列的Series;如果是Series,需要传入索引,返回一个定值。

4.5.7 数据截取.truncate

df.truncate():对DataFrame和Series进行截取,可以将索引传入before和after参数,将这个区间以外的数据剔除。

4.5.8 索引选择器

pd.IndexSlice:常用于多层索引,需要指定应用范围(subset参数)的函数中,特别是在链式方法中。

4.5.9 小结

本节介绍了数据查询的几个常用方法,可以根据需求把所需要的行和列筛选出来。
.loc[]和.iloc[]提供了行和列两个位置,可以按行和列组合筛选出数据,不同的是.iloc[]仅支持轴上的数字索引。
.at[]和.iat[]只接受一个索引,得出的是一个具体的值。
.get()可以将数据当作字典来操作,Series的键是索引,DataFrame的键是列名。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值