Pandas——索引对象

简单索引对象

pandas中,索引对象负责管理轴标签和其它元数据,Series和DataFrame的索引实际上都是Index对象。Series类和DataFrame类对象的index属性返回的就是索引对象,
在这里插入图片描述
Index对象形式上很像一个numpy的array,但是Index对象是不能修改的,下面这种试图直接修改Index对象的方式一定会报错,
在这里插入图片描述
不可修改的属性非常重要,因为不可修改,所以在多个数据结构之间能够安全共享,
在这里插入图片描述
Index类是最笼统的索引类,向下继承的还有多种Index类的子类,
在这里插入图片描述

索引对象简单运算

Index对象形式上像数组,但是不可改变。不可变的这一特性类似于Python内置类型的元组和集合。相应的运算也与集合类似,能够参与逻辑运算
在这里插入图片描述
此外,不同索引对象之间的运算也与元组和集合很相近,
在这里插入图片描述

append和concat方法

在这里插入图片描述
其中ignore_index如果为True,则不会使用之前的索引;如果verify_integrity为True,当出现重复索引时会报出ValueError的异常。

# -*- coding: utf-8 -*-
import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) #返回   A B
                                                        #    0 1 2
                                                        #    1 3 4
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB')) 

df.append(df2)	#返回   A B    默认情况下会保留原来索引
				#    0 1 2
                #    1 3 4
                #    0 5 6
                #    1 7 8

# 如果 ignore_index=True
df.append(df2, ignore_index=True)                  #返回  A B   索引会自动顺延
                                                   #    0 1 2
                                                   #    1 3 4
                                                   #    2 5 6
                                                   #    3 7 8

但是在拼接DataFrame的时候,append方法的效率并不高,官方文档中推荐的方法是concat方法

df = pd.DataFrame(columns=['A'])
pd.concat([pd.DataFrame([i], columns=['A']) for i in range(5)],  ignore_index=True)     
#返回  A
#   0 0
#	1 1
#	2 2
#	3 3
#	4 4

# 上面的concat实例理解为,
df1 = pd.DataFrame([1], columns=['A'])
df2 = pd.DataFrame([2], columns=['A'])
df3 = pd.DataFrame([3], columns=['A'])
df4 = pd.DataFrame([4], columns=['A'])
df5 = pd.DataFrame([5], columns=['A'])
pd.concat([df1,df2,df3,df4,df5])

difference、intersection和 union方法

在这里插入图片描述
在这里插入图片描述

delete和insert方法

两个方法的一般使用格式,

# delete方法
Index.delete(loc)

# insert方法
Index.insert(loc, item)

在这里插入图片描述

drop方法

drop(item)

使用示例,
在这里插入图片描述

is_unique属性

索引值不唯一,但是可能包含不同的数据,此时操作起Series和Dataframe时,就需要注意错删的情况。
在这里插入图片描述
在这里插入图片描述

索引对象操作进阶

在实际的使用中,对于索引对象的操作远不止上面列出的那些,

重索引 reindex

使用的是reindex方法,这个方法很重要,创建的是一个使用新索引的新对象,reindex方法对于Series和DataFrame都适用。以官方文档中DataFrame的介绍为例,
在这里插入图片描述

# -*- coding: utf-8 -*-
import pandas as pd

index = ['Firefox', 'Chrome', 'Safari', 'IE10', 'Konqueror']
df = pd.DataFrame({ 'http_status': [200,200,404,404,301],
                    'response_time': [0.04, 0.02, 0.07, 0.08, 1.0]},    
                    index=index)
# 得到	 	http_status     response_time
#	Firefox     200            0.04
#	Chrome   	200            0.02
#	Safari      404            0.07
#	IE10        404            0.08
#	Konqueror   301            1.00

new_index= ['Safari', 'Iceweasel', 'Comodo Dragon', 'IE10', 'Chrome']
df.reindex(new_index)                         
#返回            http_status      response_time
#		Safari   404.0                0.07
#    Iceweasel   NaN                  NaN
#Comodo Dragon   NaN                  NaN
#		  IE10   404.0                0.08
#		Chrome   200.0                0.02
# 会保留之前存在的索引,之前不存在的索引会使用缺失值进行替代

# 对缺失值进行填补可配合适用 fill_value方法,fill_value可以是任意类型的值
df.reindex(new_index, fill_value=0)  
#返回            http_status      response_time
#		Safari   404.0                0.07
#    Iceweasel   0                    0
#Comodo Dragon   0                    0
#		  IE10   404.0                0.08
#		Chrome   200.0                0.02

date_index = pd.date_range('1/1/2010', periods=6, freq='D')
df2 = pd.DataFrame({"prices": [100, 101, np.nan, 100, 89, 88]}, index=date_index) 
# 返回       prices
# 2010-01-01  100
# 2010-01-02  101
# 2010-01-03  NaN
# 2010-01-04  100
# 2010-01-05   89
# 2010-01-06   88
date_index2 = pd.date_range('12/29/2009', periods=10, freq='D')
df2.reindex(date_index2)
# 返回        prices
# 2009-12-29  NaN
# 2009-12-30  NaN
# 2009-12-31  NaN
# 2010-01-01  100
# 2010-01-02  101
# 2010-01-03  NaN
# 2010-01-04  100
# 2010-01-05   89
# 2010-01-06   88
df2.reindex(date_index2, method='bfill')
# 返回        prices
# 2009-12-29  100
# 2009-12-30  100
# 2009-12-31  100
# 2010-01-01  100
# 2010-01-02  101
# 2010-01-03  100
# 2010-01-04  100
# 2010-01-05   89
# 2010-01-06   88

# 使用columns参数则是替换之前的列名,
df.reindex(columns=['http_status', 'user_agent'])
#返回            http_status        user_agent
#		Safari   404.0                0.07
#    Iceweasel   0                    0
#Comodo Dragon   0                    0
#		  IE10   404.0                0.08
#		Chrome   200.0                0.02
#如果不使用上面的方式,可以通过axis参数传入 index或columns来指定替换行索引还是列索引
df.reindex(['http_status', 'user_agent'], axis="columns")    #结果与上方相同

上面的演示中,除了用指定的值填补缺失值,method参数给出了几个选项,

default: don’t fill gaps
pad / ffill: propagate last valid observation forward to next valid,用前放实测值填补
backfill / bfill: use next valid observation to fill gap,后方的实测值填补
nearest: use nearest valid observations to fill gap,最近的实测值填补

上面的操作都是针对整个DataFrame的索引进行的,pandas模块也同样支持对部分索引进行操作,需要与ix属性配合使用,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
之前不存在的列会使用缺失值进行填补。

Series和DataFrame的索引操作

Series索引

Series的一系列操作较为简单,因为Series的结构可以看做是一个一维数组,
在这里插入图片描述
Series使用索引对象进行切片,与平时编程语言的切片是不同的,包含头,也包含尾
在这里插入图片描述
在这里插入图片描述

DataFrame索引

DataFrame的索引操作比较复杂,因为有行索引和列索引,
在这里插入图片描述
DataFrame的切片操作也涉及到两个维度,
在这里插入图片描述
117行代码是选取three这列大于5的全部的行。

通过索引定位(loc、iloc和ix、xs方法)

对上面的三种方法进行区分,首先参考官方文档的说明,
在这里插入图片描述

方法名说明
loc通过行标签索引行数据
iloc通过行号索引行数据
ix通过行标签或者行号索引行数据(基于loc和iloc 的混合),ix是最为常用的。
xs选取单行或单列

四个方法中,xs方法由于涉及到行列操作,所以对其进行特别说明,
在这里插入图片描述

#现在有个DataFrame df
#	   A      B      C
#  a   4      5      2
#  b   4      0      9
#  c   9      7      3
df.xs('a')                
# 返回 A 4    axis=0取回的是指定的行
#	  B 5
#     C 2
#	  Name: a
df.xs('C', axis=1)   
# 返回 a 2    axis=1取回的是指定的列
#     b 9
#	  c 3
#	  Name: C

索引排序(sort_index方法)

使用的是sort_index方法,该方法返回的是已排序的新对象,
在这里插入图片描述

Series索引排序

Series索引排序,方式很简单,因为只有一个维度,
在这里插入图片描述

DataFrame索引排序

Dataframe索引排序涉及到两个维度,可以使用axis参数进行指定,

axis参数值排序对象
axis=0行索引排序
axis=1列索引排序

在这里插入图片描述
sort_index方法默认是升序排列,如果需要降序,可以指定 asending参数为False。
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Pandas DataFrame索引是指用于访问和操作DataFrame中数据的标签或位置。DataFrame索引可以是行标签、列标签或位置标签。行标签通常是数据的唯一标识符,列标签是数据的特征或属性,位置标签是数据在DataFrame中的位置。Pandas提供了多种索引方式,包括标签索引、位置索引、布尔索引等。通过索引,可以方便地对DataFrame进行数据的选择、过滤、排序、分组等操作。 ### 回答2: Pandas是一个用于数据处理和分析的Python库。Pandas DataFrame是一种二维表格数据结构,类似于电子表格或SQL表格。在DataFrame中,每一列可以存储不同的数据类型(例如数字、字符串和布尔值),而每一行则对应于一个观察或记录。 DataFrame中最常见的数据操作是选择、过滤和修改数据。为了进行这些操作,我们需要了解如何使用DataFrame索引。DataFrame索引可以以多种方式进行设置,包括使用列名称、行号和自定义索引。在本文中,我们将讨论这些不同类型的索引以及如何使用它们进行数据操作。 使用列名称进行索引 最常见的DataFrame索引方法是使用列名称进行索引。可以通过DataFrame对象的"[]"运算符来选择单个列或多个列。例如,下面的代码选择名为"Name"和"Age"的两列: df[['Name', 'Age']] 如果要选择单个列,请省略集合符号。例如,下面的代码选择单个名为"Name"的列: df['Name'] 在选择了一个或多个列之后,可以使用不同的方法对DataFrame进行筛选、切片或修改。例如,可以使用"loc"方法根据特定条件进行筛选: df.loc[df['Age'] > 18] 使用行号进行索引 另一种常见的DataFrame索引方法是使用行号进行索引。每行的索引号都会自动分配,从零开始递增。可以使用"iloc"方法根据行号选择单个行或多个行。例如,下面的代码选择第一行和第二行: df.iloc[[0, 1]] 如果要选择所有行,请使用冒号操作符。例如,下面的代码选择所有行: df.iloc[:] 使用自定义索引进行索引 当DataFrame中的默认行号和列号不够用时,可以通过自定义索引进行索引。自定义索引可以是任意类型的Python对象,例如字符串、日期或数字。可以使用"set_index"方法将DataFrame的列设置为自定义索引。 例如,可以使用以下代码将"Name"列设置为自定义索引: df.set_index('Name', inplace=True) 在这种情况下,我们可以使用"loc"方法根据自定义索引进行筛选。例如,下面的代码选择名为"John"的所有行: df.loc['John'] 总之,DataFrame索引是进行数据操作的必要工具。通过熟练掌握列名称、行号和自定义索引,我们可以快速准确地选择、过滤和修改DataFrame中的数据。 ### 回答3: pandas是一个强大的数据分析工具,它提供了许多数据结构以便于我们对数据进行处理。其中最重要的一种数据结构就是DataFrame,它是一个二维的表格数据结构,每一列都是一个Series数据结构,而每一行则是这些Series数据结构的组合,每个元素都有一个对应的索引值,而这些索引值正是DataFrame数据结构的核心部分之一。 DataFrame有两种索引方式,分别是行索引和列索引。每个行和列的索引都是唯一的,它们可以是数字、字符串或者时间戳等类型的数据。行索引可以通过.loc[] 或者 .iloc[]方法来访问,而列索引可以通过列名来访问。 行索引可以使用如下方法访问: 1. .loc[]:通过行标签或条件选择行数据。 2. .iloc[]:通过行号选择行数据。 列索引可以使用如下方法访问: 1. 通过列名选择列数据:df['列名'] 2. 通过.loc[]方法选择列数据:df.loc[:, '列名'] 3. 通过.iloc[]方法选择列数据:df.iloc[:, 列号] 需要注意的是,DataFrame使用列索引时返回的是Series类型的数据,而不是DataFrame类型的数据。如果需要返回DataFrame类型的数据,我们可以使用双层方括号: df[['列名1', '列名2'...]] 另外,我们也可以使用df.columns来获取所有的列名,使用df.index来获取所有的行标签。 总体来说,pandas提供了非常丰富的DataFrame索引方法,可以满足各种各样的数据访问需求。掌握好这些方法对于数据分析和处理非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jakob_Hu

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值