调整索引和修改标签
可以直接修改索引:
df.index = ['a', 'b', 'c']
以下讲的方法除非是指定inplace=True,否则都是生成一个新的Pandas对象。
调整索引
只是调整了索引顺序,并没有修改索引与值的对应关系。
reindex()
:重新索引并得到一个新的Pandas对象。
set_index()
:使用某一列作为索引。
df.reindex(['b', 'c', 'e'])
df.set_index('two')
随着索引的变化,索引相对应的行元素的值的顺序也跟着发生了改变。如果某个索引值当前不存在,就引入缺失值。
如果要对列进行重新索引,设置columns即可,如下所示:
df.reindex(columns=['two', 'three', 'four'])
修改标签
使用rename()
方法结合dict、Series或者一个函数将原标签映射为一个新标签。
例:将索引标签转换为大写,将表头转换成大写:
df.rename({'a':'A', 'b':'B', 'c':'C'})
#将索引标签转换为大写
df.rename(columns=str.upper)
#将表头转换成大写
层次化索引
层次化索引使得我们可以基于Pandas的基本数据结构Series(一维)和DataFrame(二维)创建更高维的数据。
一个拥有多级别索引的Series的结构:
data = pd.Series(np.random.randn(5),
index=[['a', 'a', 'b', 'b', 'b'],
['a1', 'a2', 'b1', 'b2', 'b3']])
不仅在index轴上可以有多个级别,在columns轴也可以有多个级别。
创建层次化索引
三种方式:
-
pd.MultiIndex.from_arrays
,从数组或者列表创建 -
pd.MultiIndex.from_tuples
,从多个元组组成的列表创建 -
pd.MultiIndex.from_product
,从多个列表交叉组合创建
arrays = np.array([['a', 'a', 'a', 'b', 'b', 'b'], ['x', 'y', 'z', 'x', 'y', 'z']])
tuples = [('a', 'x'), ('a', 'y'), ('a', 'z'), ('b', 'x'), ('b', 'y'), ('b', 'z')]
iterable = [['a', 'b'], ['x', 'y', 'z']]
pd.MultiIndex.from_arrays(arrays)
pd.MultiIndex.from_tuples(tuples)
pd.MultiIndex.from_product(iterable)
每个Index对象(无论是index轴上还是columns轴上的)都可有一个属性——名称names,我们可以将其当成索引列的列名,通过.index.names可以对其进行创建和修改:
data.index.names = ['first', 'second']
重排级别顺序
要将columns轴上的索引级别互换顺序,则可以用swaplevel
方法,该方法接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不发生变换)。
如下代码所示,其中的0表示第一级别,就是最上层的['Male', 'Female']一级,而1表示第二级别,代表处于第一级别下方的['Young', 'Old']:
df.swaplevel(0, 1, axis=1)
提取部分数据:
使用.loc
和.iloc
方法,不过需要先通过.loc(axis)指定对行索引还是对列索引。
例:提取第二级别索引为'x'的数据。
df.loc(axis=0)[:, 'x']
使用xs()
方法,随任意级别的index和columns数据进行提取:
df.xs('x', level=1, axis=0)
df.xs('Old', level=1, axis=1)
#
unstack, stack
unstack
方法:将指定级别(level参数)安排在columns轴上,形成一个新的DataFrame。
df.unstack(level=0)
stack是unstack操作的逆运算,以下操作即把columns的第二级别转换到index的最内级别中:
df.stack(level=1)
将索引转换为一列数据
使用reset_index
方法重置层级索引。
参数
-
level
:提取的Index级别 -
col_level
:放入的Columns级别
df.reset_index(level=1, col_level=1)
网友评论