一、调整索引、修改列标签
1、调整索引的两种情况:
- 重新索引
- 设置新的索引
(1)重新索引
在Pandas对象中,其实索引也是一个对象,所以可对其进行修改。
例如:df.index=['a','b','c']
>>> df = {'one':pd.Series(np.random.randn(3)),'two':pd.Series(np.random.randn(3)), 'three':pd.Series(np.random.rand(3))} >>> df = pd.DataFrame(df) >>> df one two three 0 -0.996986 0.190981 0.482912 1 -0.233812 -0.140953 0.052706 2 0.470900 0.590664 0.486823 #设置索引 >>> df.index=['a','b','c'] >>> df one two three a -0.996986 0.190981 0.482912 b -0.233812 -0.140953 0.052706 c 0.470900 0.590664 0.486823
(2)设置新的索引
reindex():重新索引并得到一个新的Pandas对象。
且reindex()方法不仅可以重新索引DataFrame,也可以同时实现过滤功能。
>>> new = df.reindex(['b','c','e']) >>> new one two three b -0.233812 -0.140953 0.052706 c 0.470900 0.590664 0.486823 e NaN NaN NaN
reindex()
也可以用来调整列的顺序,这时需要设定axis
参数为'columns'或1;
>>> df.reindex(['three','two','one'],axis='columns') three two one a 0.766450 0.452801 1.286715 b 0.342262 1.523188 0.620788 c 0.867786 0.758714 -2.343242
(3)使用set_index()可以指定某一列为索引,这在对日期型数据或者是以名称进行区分的数据非常有用,后期会以实例描述的更为详细。
>>> df.set_index('one') two three one -0.996986 0.190981 0.482912 -0.233812 -0.140953 0.052706 0.470900 0.590664 0.486823
上述的方法在将某一列设置为索引后,特征不会将该列进行保存,若需要将设置为索引的列保留在数据中,则需要将参数drop设置为False:
>>> df.set_index('one',drop=False)
one two three one 1.286715 1.286715 0.452801 0.766450 0.620788 0.620788 1.523188 0.342262 -2.343242 -2.343242 0.758714 0.867786
若是希望在原来索引的基础之上添加新的变量构成层次化索引,则设置append参数为True;
>>>df.set_index('one',append=True)
>>> df one two three a 1.286715 0.452801 0.766450 b 0.620788 1.523188 0.342262 c -2.343242 0.758714 0.867786 >>> df.set_index('one',append=True) two three one a 1.286715 0.452801 0.766450 b 0.620788 1.523188 0.342262 c -2.343242 0.758714 0.867786
2、修改标签
修改索引和列名的标签可以使用rename()方法结合字典、Series或者一个原函数将标签映射为一个新的标签。
(1)关于结合字典可以参照3-Pandas之Series和DataFrame区别的第六部分,
(2)使用函数映射的方式
例:将字符串的大写转换函数传入,对列标签进行修改
>>> df.rename(columns=str.upper) ONE TWO THREE a -0.996986 0.190981 0.482912 b -0.233812 -0.140953 0.052706 c 0.470900 0.590664 0.486823
例:结合lambda:将所有的列的前2个字符大写,其余小写
>>> df.rename(columns=lambda x:x[:2].upper()+x[2:].lower()) ONe TWo THree a -0.996986 0.190981 0.482912 b -0.233812 -0.140953 0.052706 c 0.470900 0.590664 0.486823
二、创建层次化索引
层次化索引可以基于Series和DataFrame创建更加高维的数据。
也就是说,若有一个DataFrame是一个堆积式的(在一个轴上需要创建不止一个索引),那么此时就需要用到层次化索引,这和Panel有些类似。但是在实际中并不是很常用!
创建一个层次化索引:
>>> data=pd.Series(np.random.randn(5),index=[['a','a','b','b','b'],['a1','a2','b1','b2','b3']]) >>> data a a1 0.792324 a2 -0.650764 b b1 -0.282874 b2 -1.402477 b3 -3.551578 dtype: float64 #查看索引 >>> data.index MultiIndex(levels=[['a', 'b'], ['a1', 'a2', 'b1', 'b2', 'b3']], codes=[[0, 0, 1, 1, 1], [0, 1, 2, 3, 4]]) #levels包含了每个级别索引的标签,labels是对每个数据在对应不同levels的位置进行了标记
每个index均有一个属性(名称names),可通过.index.names对索引列的列名进行创建于修改
>>> data.index.names=['first','second'] >>> data first second a a1 0.792324 a2 -0.650764 b b1 -0.282874 b2 -1.402477 b3 -3.551578 dtype: float64
三、重排级别顺序
重排级别顺序是基于有索引个数>=1的DataFrame。
(1)swaplevel():将columns轴上的索引级别进行互换。
>>>df.swaplevel(0,1,axis=1)
(2)reorder_levels():指定多个级别的顺序
(3)提取数据还是可以使用iloc()与loc()
(4)unstack():若index轴上有多个级别索引的DataFrame,使用该方法将指定级别(level参数)安排在columns上形成一个新的DataFrame