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
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 李明 | 男 | 24 | 3600 |
1 | 王小红 | 女 | 28 | 4000 |
2 | 杨勇 | 男 | 30 | 4500 |
3 | 张艳 | 女 | 31 | 5000 |
4 | 陈丹 | 女 | 25 | 2800 |
5 | 李志敏 | 男 | 32 | 5000 |
6 | 张建国 | 男 | 45 | 8000 |
7 | 杨平远 | 男 | 50 | 10000 |
8 | 周源 | 男 | 40 | 7000 |
修改行索引(index)和列索引(columns),并添加行索引(df.index.name)和列索引标签(df.cloumns.name)
df.columns=['名字','性别','年龄','工资']
df.index.name='序号'
df.columns.name='类型'
df
类型 | 名字 | 性别 | 年龄 | 工资 |
---|---|---|---|---|
序号 | ||||
0 | 李明 | 男 | 24 | 3600 |
1 | 王小红 | 女 | 28 | 4000 |
2 | 杨勇 | 男 | 30 | 4500 |
3 | 张艳 | 女 | 31 | 5000 |
4 | 陈丹 | 女 | 25 | 2800 |
5 | 李志敏 | 男 | 32 | 5000 |
6 | 张建国 | 男 | 45 | 8000 |
7 | 杨平远 | 男 | 50 | 10000 |
8 | 周源 | 男 | 40 | 7000 |
导入数据后,进入正题
利用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.0 | 1.00 |
空调 | 1980.0 | 1.00 | |
TCL | 电视机 | 3600.0 | 0.96 |
空调 | 2100.0 | 0.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.0 | 1.0 |
df[0:2]['价格']
格力 电视机 2300.0
空调 1980.0
Name: 价格, dtype: float64
3.调整层级索引间的顺序
首先指定层级索引中每一层索引的名称,然后再使用swaplevel()函数来调整层级索引间的顺序,其示例代码如下:
df.index.names=['key1','key2']
df.swaplevel('key1','key2')
价格 | 折扣率 | ||
---|---|---|---|
key2 | key1 | ||
电视机 | 格力 | 2300.0 | 1.00 |
空调 | 格力 | 1980.0 | 1.00 |
电视机 | TCL | 3600.0 | 0.96 |
空调 | TCL | 2100.0 | 0.98 |
4.对某级别索引排序
使用sort_index(level)函数实现对某级别索引的排序,其代码如下:
df.sort_index(level=1)
价格 | 折扣率 | ||
---|---|---|---|
key1 | key2 | ||
TCL | 电视机 | 3600.0 | 0.96 |
格力 | 电视机 | 2300.0 | 1.00 |
TCL | 空调 | 2100.0 | 0.98 |
格力 | 空调 | 1980.0 | 1.00 |
5.根据某级别索引进行汇总
使用sum(level,axis)函数可根据某级别索引进行汇总
df.sum(level=1,axis=0)
价格 | 折扣率 | |
---|---|---|
key2 | ||
电视机 | 5900.0 | 1.96 |
空调 | 4080.0 | 1.98 |
6.指定DataFrame的列为索引或还原索引列
使用set_index()函数可指定DataFrame的列为索引,reset_index()函数可还原索引列
df.reset_index()
key1 | key2 | 价格 | 折扣率 | |
---|---|---|---|---|
0 | 格力 | 电视机 | 2300.0 | 1.00 |
1 | 格力 | 空调 | 1980.0 | 1.00 |
2 | TCL | 电视机 | 3600.0 | 0.96 |
3 | TCL | 空调 | 2100.0 | 0.98 |
df.set_index('价格')
折扣率 | |
---|---|
价格 | |
2300.0 | 1.00 |
1980.0 | 1.00 |
3600.0 | 0.96 |
2100.0 | 0.98 |