索引对象
pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建series或DataFrame时,所用到的任何数组或其他序列的标签都会转换成一个index:
In [1]: import pandas as pd In [2]: import numpy as np In [3]: from pandas import Series In [4]: obj=Series(range(3),index=[‘a‘,‘b‘,‘c‘]) In [5]: index=obj.index In [6]: index Out[6]: Index([‘a‘, ‘b‘, ‘c‘], dtype=‘object‘) In [7]: index[1:] Out[7]: Index([‘b‘, ‘c‘], dtype=‘object‘)
index对象是不可修改的(immutable),因此用户不能对其进行修改
In [8]: index[1]=‘d‘ --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-8-8be6e68dba2d> in <module>() ----> 1 index[1]=‘d‘ d:\python\python36\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value) 2048 2049 def __setitem__(self, key, value): -> 2050 raise TypeError("Index does not support mutable operations") 2051 2052 def __getitem__(self, key): TypeError: Index does not support mutable operations
不可修改性非常重要,因为这样才能使Index对象在多个数据结构之间安全共享:
In [9]: index=pd.Index(np.arange(3)) In [10]: obj2=Series([1.5,-2.5,0],index=index) In [11]: obj2.index is index Out[11]: True In [12]: obj2.index Out[12]: Int64Index([0, 1, 2], dtype=‘int64‘)
Index类为pandas库中内置的类。
pandas中主要的index对象:
1.index 最泛化的Index对象,将轴标签表示为一个由python对象组成的Numpy数组
2.Int64Index 针对整数的特殊Index
3.MultilIndex “层次化”索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组。
4.DatatimeIndex 存储纳秒级时间戳(用Numpy的datatime64类型表示)
5.PeriodIndex 针对Period数据(时间间隔)的特殊Index
Index的方法和属性
append 连接另一个Index对象,产生一个新的Index
diff 计算差集,并得到一个Index
intersection 计算交集
union 计算并集
isin 计算一个指示各值是否都包含在参数集合那种的布尔型数组
delete 删除索引i处的元素,并得到一个新的Index
drop 删除传入的值,并得到新的Index
insert 将元素插入到索引i处,并得到一个新的Index
is_monotonic 当各元素均大于等于前一个元素时,返回True
is_unique 当Index没有重复值时,返回True
unique 计算Index中唯一值的数组
重新索引
pandas对象的一个重要方法是reindex,其作用是创建一个适应新索引的新对象。
In [16]: obj=Series([4.5,7.3,-5.3,3.6],index=[‘d‘,‘b‘,‘a‘,‘c‘]) In [17]: obj Out[17]: d 4.5 b 7.3 a -5.3 c 3.6 dtype: float64
调用该Series的reindex将会根据新索引进行重排。如果当某个索引值当前不存在,就引入缺失值:
In [18]: obj2=obj.reindex([‘a‘,‘b‘,‘c‘,‘d‘,‘e‘]) In [19]: obj2 Out[19]: a -5.3 b 7.3 c 3.6 d 4.5 e NaN dtype: float64
In [22]: obj.reindex([‘a‘,‘b‘,‘c‘,‘d‘,‘e‘],fill_value=0) Out[22]: a -5.3 b 7.3 c 3.6 d 4.5 e 0.0 dtype: float64
对于时间序列这样的有序数据,重新索引可能需要做一些插值处理。method选项可以达到这个目的。
使用ffill可以实现前向值填充:
In [23]: obj3=Series([‘blue‘,‘purple‘,‘yellow‘],index=[0,2,4]) In [24]: obj3.reindex(range(6),method=‘ffill‘) Out[24]: 0 blue 1 blue 2 purple 3 purple 4 yellow 5 yellow dtype: object
reindex的(插值)method选项:
ffill 或pad 前向填充(或搬运)值
bfill 或backfill 后向填充(或搬运)值
对于DataFrame,reindex可以修改(行)索引 丶列,或2个都修改。如果仅传入一个序列,则会重新索引行:
In [26]: from pandas import DataFrame In [27]: frame = DataFrame(np.arange(9).reshape((3,3)),index=[‘a‘,‘c‘,‘d‘],columns=[‘Ohio‘,‘Texas‘,‘California‘]) In [28]: frame Out[28]: Ohio Texas California a 0 1 2 c 3 4 5 d 6 7 8 In [29]: frame2=frame.reindex([‘a‘,‘b‘,‘c‘,‘d‘]) In [30]: frame2 Out[30]: Ohio Texas California a 0.0 1.0 2.0 b NaN NaN NaN c 3.0 4.0 5.0 d 6.0 7.0 8.0
使用columns关键字可以重新索引列:
In [31]: states=[‘Texas‘,‘Utah‘,‘California‘] In [32]: frame.reindex(columns=states) Out[32]: Texas Utah California a 1 NaN 2 c 4 NaN 5 d 7 NaN 8
也可以同时对行和列进行重新索引,而插值则只能按行应用:
In [44]: frame.reindex(index=[‘a‘,‘b‘,‘c‘,‘d‘],method=‘ffill‘) Out[44]: Ohio Texas California a 0 1 2 b 0 1 2 c 3 4 5 d 6 7 8
In [46]: frame.reindex(index=[‘a‘,‘b‘,‘c‘,‘d‘],method=‘ffill‘).reindex(columns=states) Out[46]: Texas Utah California a 1 NaN 2 b 1 NaN 2 c 4 NaN 5 d 7 NaN 8
利用ix的标签索引功能,重新索引任务可以变得更简洁:
In [54]: frame.ix[[‘a‘,‘b‘,‘c‘,‘d‘],states] Out[54]: Texas Utah California a 1.0 NaN 2.0 b NaN NaN NaN c 4.0 NaN 5.0 d 7.0 NaN 8.0
原文地址:https://www.cnblogs.com/catxjd/p/9201595.html