【Python数据分析基础笔记(仅供本人学习记录)】P3.pandas的索引

index索引对象

在这里插入图片描述

一、index对象的属性和方法

1.获取index对象

接下来是准备实验数据,即导入数据

import numpy as np
import pandas as pd

导入excel表格数据

dt=np.loadtxt('salary.csv',delimiter=",",skiprows=1,dtype=object)
dt
array([['李明', '男', '24', '3600'],
       ['王小红', '女', '28', '4000'],
       ['杨勇', '男', '30', '4500'],
       ['张艳', '女', '31', '5000'],
       ['陈丹', '女', '25', '2800'],
       ['李志敏', '男', '32', '5000'],
       ['张建国', '男', '45', '8000'],
       ['杨平远', '男', '50', '10000'],
       ['周源', '男', '40', '7000']], dtype=object)

将数组传递给DataFrame()构造函数

df=pd.DataFrame(dt)
df
0123
0李明243600
1王小红284000
2杨勇304500
3张艳315000
4陈丹252800
5李志敏325000
6张建国458000
7杨平远5010000
8周源407000

修改行索引(index)和列索引(columns),并添加行索引(df.index.name)和列索引标签(df.cloumns.name)

df.columns=['名字','性别','年龄','工资']
df.index.name='序号'
df.columns.name='类型'
df
类型名字性别年龄工资
序号
0李明243600
1王小红284000
2杨勇304500
3张艳315000
4陈丹252800
5李志敏325000
6张建国458000
7杨平远5010000
8周源407000

导入数据后,进入正题
利用index属性可以获取index对象,例如,获取产品价格的DataFrame数据结构中的index对象(列索引)

suoyin=df.index
suoyin
RangeIndex(start=0, stop=9, step=1, name='序号')

2.索引切片

对索引的切片与python对列表的切片相同,即index[起始值:终止值:步长]。

3.判断索引是否属于index对象

in()函数可用于判断是否属于index对象。例如,判断上表中“5”索引是否属于index对象,其示例代码如下:

index1=df.index
index1
RangeIndex(start=0, stop=9, step=1, name='序号')
5 in index1
True
'5' in index1
False

'5’代表的是一个字符,但表中是数字,所以不存在

4.链接两个index对象

利用append()函数连接另一个index对象,可产生一个新的index对象。例如,创建一个index2,与index1连接成一个新的对象

#创建columns2对象
index2=pd.Index(['电话','住址','血型',8,5,9])
index3=index1.append(index2)
index3
Index([0, 1, 2, 3, 4, 5, 6, 7, 8, '电话', '住址', '血型', 8, 5, 9], dtype='object')

5.计算差集

利用difference()函数可实现计算差集的操作,其实例代码如下:

#计算两个index对象的差集
index4=index3.difference(index1)
index4
#从结果可以看出,意思就是输出index3与index1不一样的值
Index([9, '住址', '电话', '血型'], dtype='object')

6.计算交集

利用intersection()函数可实现计算交集的操作,其代码如下:

#计算index2和index1的交集
index5=index2.intersection(index1)
index5
Index([8, 5], dtype='object')

7.计算并集

使用union()函数

index6=index1.union(index2)
index6
Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '住址', '电话', '血型'], dtype='object')

8.判断索引是否存在

利用isin()函数可实现判断一个索引对象是否在另一个索引对象中,返回一个bool类型的数组的操作,其代码如下:

index3=index1.isin(index2)
index3
array([False, False, False, False, False,  True, False, False,  True])

9.删除索引

使用delete()函数可以删除指定位置<索引>,返回一个新的索引对象,其示例代码如下:

index2
Index(['电话', '住址', '血型', 8, 5, 9], dtype='object')
index=index2.delete([0,2])
index
Index(['住址', 8, 5, 9], dtype='object')

10.插入元素

利用insert()函数将元素插入到指定下标位置,返回一个新索引对象

index
Index(['住址', 8, 5, 9], dtype='object')
index=index.insert(2,'学校')
index
Index(['住址', 8, '学校', 5, 9], dtype='object')

11.判断索引对象中是否存在重复值

is_unique函数,有则返回False,没有则返回True

12.筛选出index对象去重后的元素

unique()函数可筛选出index对象去重后的元素,组成一个新的index对象

13.判断递增或递减

is_monotonic或is_monotonic_increasing()函数可判断index对象中的元素是否递增,is_monotonic_decreasing()函数可判断index的对象中的元素是否递减 是则返回True,不是则返回False

二、重新索引

reindex是pandas对象中的一个重要方法,其作用是创建一个适应新索引的新对象。例如定义一个Series对象为se1=pd.Series([1,4,-1,2],index=[‘a’,‘e’,‘d’,‘c’]),现在调用Series对象的重新索引se1.reindex([‘a’,‘b’,‘c’,‘d’,‘e’]),此时,se1中的元素将会根据新索引进行重排,如果某个索引值当前不存在,就引入NaN,其实例代码如下:

se1=pd.Series([1,4,-1,2],index=['a','e','d','c'])
se1.reindex(['a','b','c','d','e'])
a    1.0
b    NaN
c    2.0
d   -1.0
e    4.0
dtype: float64

reindex()函数的格式如下:
obj.reindex(index[,method[,columns[,fill_value[,limit[,level[,copy]]]]]])
obj:pandas对象名称
index:用作索引的新序列。既可以是index实例,也可以是其他序列型的Python数据结构。index会被完全使用。

method:插值填充方式,ffill或.pad表示向前填充(或搬运)值,bfill或backfill表示向后填充(或搬运)值

fill_value:在重新索引过程中,需要引入缺失值时使用的替代值

limit:向前或向后填充时的最大填充量

level:在Multilidnex的指定级别上匹配简单索引,否定选取其子集

copy:默认为true,表示无论如何都复制。如果为False,则表示新旧相等就不复制

#利用reindex()函数重新定义Series和DataFrame的索引及顺序
import numpy as np
from pandas import DataFrame,Series
print ('重新指定索引及顺序')
se1=Series([2.1,4.3,-1.6],index=['c','e','a'])
print(se1)
#指定不存在元素默认值为0
print(se1.reindex(['a','b','c','d','e'],fill_value=0))
print('重新指定索引,并指定填充元素的方法')
se2=Series(['20170101','20170102','20170104'],index=[0,2,4])
print(se2.reindex(range(6),method='ffill'))
print('对DataFrame重新指定索引')
df1=DataFrame(np.arange(12).reshape(3,4),index=['a','c','d'],
              columns=['item1','item2','item3','item4'])
print(df1)
#指定不存在以元素的默认值为0
df2=df1.reindex(['a','b','c','d'],fill_value=0)
print(df2)
print('重新指定column')
states=['coll','item2','item3']
print(df1.reindex(columns=states))
print('对DataFrame重新指定索引,并指定填写元素的方法')
print(df1.reindex(index=['a','b','c','d'],method='ffill',columns=states))
重新指定索引及顺序
c    2.1
e    4.3
a   -1.6
dtype: float64
a   -1.6
b    0.0
c    2.1
d    0.0
e    4.3
dtype: float64
重新指定索引,并指定填充元素的方法
0    20170101
1    20170101
2    20170102
3    20170102
4    20170104
5    20170104
dtype: object
对DataFrame重新指定索引
   item1  item2  item3  item4
a      0      1      2      3
c      4      5      6      7
d      8      9     10     11
   item1  item2  item3  item4
a      0      1      2      3
b      0      0      0      0
c      4      5      6      7
d      8      9     10     11
重新指定column
   coll  item2  item3
a   NaN      1      2
c   NaN      5      6
d   NaN      9     10
对DataFrame重新指定索引,并指定填写元素的方法
   coll  item2  item3
a   NaN      1      2
b   NaN      1      2
c   NaN      5      6
d   NaN      9     10

三、层级索引

pandas有Series和DataFrame两种数据结构,他们分别用于处理一位数据和二维数据。但是在实际应用中经常会遇到多维数据的情况,为了处理多维数据,可使用层级索引,将高维数据转化为类似一维Series和二维DataFrame对象的形式
层级索引就是对索引进行层次分类,该索引既可以是行索引,也可以是列索引。层级索引是pandas的一项重要功能,它能在一个轴上拥有多个(两个以上)索引级别。利用层级索引可以实现以低维度形式处理高维度数据。

1.创建层级索引

(1)创建Series的层级索引

常用的方法是给Series()构造函数的index参数传递两个数组。例如,创建一个有整数和文字组成的层级索引,其代码如下:

import pandas as pd
se=pd.Series(['电视机',2300,'空调',1980],index=[[1,1,2,2],
                ['product','price','product','price']])
se
1  product     电视机
   price      2300
2  product      空调
   price      1980
dtype: object

(2)创建DataFrame的层级索引

1).隐式构造层次索引:常用的方法是构造函数DataFrame()的index或columns参数传递两个或两个以上的数组。例如,创建一个包含品牌、产品类型、价格和折扣率的产品信息DataFrame对象,该DataFrame的行索引中就包含品牌与产品类型的层次索引,其示例代码如下:

import numpy as np
from pandas import DataFrame,Series
data=np.array([[2300,1.00],[1980,1.00],[3600,0.96],[2100,0.98]])
df=DataFrame(data,columns=['价格','折扣率'],index=[['格力','格力','TCL','TCL'],['电视机','空调','电视机','空调']])
df
价格折扣率
格力电视机2300.01.00
空调1980.01.00
TCL电视机3600.00.96
空调2100.00.98

层级索引(MultiIndex)继承于index,是多级索引的对象。MultIndex有levels和codes两个信息。levels表示每个层级中分别有哪些标签,labels是每个标签的下标。利用levels属性可获取索引中每一级的标签,而labels属性可获取标签的下标。还可以使用get_loc()和get_indexer()来获取单个和多个标签的下标。
以产品信息DataFrame实例df为例,获取df标签的下标,其示例代码如下:

mindex=df.index     #MultiInedx对象
mindex[0:4]

MultiIndex([( '格力', '电视机'),
            ( '格力',  '空调'),
            ('TCL', '电视机'),
            ('TCL',  '空调')],
           )
mindex.levels[0]
Index(['TCL', '格力'], dtype='object')
mindex.codes[0]
array([1, 1, 0, 0], dtype=int8)
mindex.get_loc(('格力','电视机'))
0
mindex.get_indexer([('格力','电视机'),('TCL','空调'),'nothing'])
array([ 0,  3, -1], dtype=int64)

2).显示构造pd.MultiIndex:显示构造pd.MultiIndex就是使用from_开头的MultiIndex类方法,从特定的数据结构创建MultiIndex对象。以创建产品信息的层级索引为例,其示例代码如下:

#使用from_arrays)()方法,从多个数组创建MultiIndex对象
df_arrays=DataFrame(data,columns=['价格','折扣率'],
    index=pd.MultiIndex.from_arrays([['格力','格力','TCL','TCL'],
                             ['电视机','空调','电视机','空调']]))
#使用from_tuples()方法,从多个元素创建MultiIndex对象
df_tuples=DataFrame(data,columns=['价格','折扣率'],
    index=pd.MultiIndex.from_tuples([('格力','电视机'),('格力','空调'),
                              ('TCL','电视机'),('TCL','空调')]))
#使用from_product()方法,利用多个集合的笛卡尔积创建MultiIndex对象
de_product=DataFrame(data,columns=['价格','折扣率'],
        index=pd.MultiIndex.from_product([['格力','TCL'],['电视机','空调']]))

2.层级索引对象的元素选择

(1)Series的元素选择

通过中括号([])的索引和切片操作可获取单个或多个元素,或使用loc与iloc同样也能获取单个或多个元素。

(2)DataFrameD的元素选择

1.直接使用列名称选择1列元素,例如df[‘价格’],表示选择"价格"这1列元素
2.使用中括号[]或iloc()函数的切片操作可选择1行或多行元素。如df[0:1]与df.iloc[0:1]选择是行索引为“0”的这1行元素,而df[0:3]与df.iloc[0:3]选择的是行索引为“0”,“1”,“2”的这3行元素
3.使用行索引切片和列名称组合可选择某个范围的元素,如df[0:2][‘价格’]

df['价格']
格力   电视机    2300.0
     空调     1980.0
TCL  电视机    3600.0
     空调     2100.0
Name: 价格, dtype: float64
df[0:1]
价格折扣率
格力电视机2300.01.0
df[0:2]['价格']
格力  电视机    2300.0
    空调     1980.0
Name: 价格, dtype: float64

3.调整层级索引间的顺序

首先指定层级索引中每一层索引的名称,然后再使用swaplevel()函数来调整层级索引间的顺序,其示例代码如下:

df.index.names=['key1','key2']
df.swaplevel('key1','key2')
价格折扣率
key2key1
电视机格力2300.01.00
空调格力1980.01.00
电视机TCL3600.00.96
空调TCL2100.00.98

4.对某级别索引排序

使用sort_index(level)函数实现对某级别索引的排序,其代码如下:

df.sort_index(level=1)
价格折扣率
key1key2
TCL电视机3600.00.96
格力电视机2300.01.00
TCL空调2100.00.98
格力空调1980.01.00

5.根据某级别索引进行汇总

使用sum(level,axis)函数可根据某级别索引进行汇总

df.sum(level=1,axis=0)
价格折扣率
key2
电视机5900.01.96
空调4080.01.98

6.指定DataFrame的列为索引或还原索引列

使用set_index()函数可指定DataFrame的列为索引,reset_index()函数可还原索引列

df.reset_index()
key1key2价格折扣率
0格力电视机2300.01.00
1格力空调1980.01.00
2TCL电视机3600.00.96
3TCL空调2100.00.98
df.set_index('价格')
折扣率
价格
2300.01.00
1980.01.00
3600.00.96
2100.00.98
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TryBest_

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值