Python Pandas – 用层次结构的名称来删除请求的级别,并返回多层索引
Pandas是Python中非常常用的数据处理库之一。Pandas提供了对各种数据格式的轻松操作,特别是对于表格数据的操作。然而,在面对具有多层结构的表格数据时,如何删除部分级别并返回多级索引是一个需要注意的问题。本文将为大家介绍如何使用Python Pandas处理这种表格数据。
构建多级索引表格数据
我们首先来构建一个随机生成的多级表格数据:
import pandas as pd
import numpy as np
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
这里我们使用了numpy的随机数模块生成一个8行2列的数组,并按照指定索引转换为Pandas DataFrame对象。我们可以看一下生成的表格数据,它长这个样子:
A B
first second
bar one 1.764052 0.400157
two 0.978738 2.240893
baz one 1.867558 -0.977278
two 0.950088 -0.151357
foo one -0.103219 0.410599
two 0.144044 1.454274
qux one 0.761038 0.121675
two 0.443863 0.333674
我们可以看到,这个表格数据中有两个层次,即first和second。
利用pandas.MultiIndex.remove_unused_levels()方法删除指定层
假如我们想要删除second层次,则可以使用remove_unused_levels()方法将其删除:
df = df.reset_index(level=1, drop=True)
df = df.reorder_levels(['second', 'first'])
df.index.remove_unused_levels()
我们可以发现,second层次已经被删除,现在仅剩下first层次:
A B
second
one 1.764052 0.400157
two 0.978738 2.240893
one 1.867558 -0.977278
two 0.950088 -0.151357
one -0.103219 0.410599
two 0.144044 1.454274
one 0.761038 0.121675
two 0.443863 0.333674
最后一层次的删除与保留
其实这里有一个比较微妙的问题:第一种方式可以完全删除某一个层次,但是如果我们想要删除一个表格数据里面的最后一层次,该如何操作呢?如果我们按照上面的方式来删除最后一层次,那么所有数据都会合成为单层索引,就无法区分数据了。那么我们该如何操作呢?
我们可以使用get_level_values()方法获取索引的某一层次对应的值:
last_idx = df.index.get_level_values(-1)
这样,我们就获取到了表格数据最后一层的值。此时,我们可以使用reset_index()方法将其转换为正常的列:
df = df.reset_index()
df = df.drop(['second'], axis=1)
df = df.set_index(['first', last_idx])
这个时候,我们的表格数据里面已经没有second这一层次了。这个时候,我们的表格数据长这个样子:
A B
first
bar one 1.764052 0.400157
two 0.978738 2.240893
baz one 1.867558 -0.977278
two 0.950088 -0.151357
foo one -0.103219 0.410599
two 0.144044 1.454274
qux one 0.761038 0.121675
two 0.443863 0.333674
我们可以看到,现在表格数据仅剩下first这一层次了,而最后一层次的信息则被转换为了一列数据。
结论
本文介绍了如何利用Python Pandas操作多级索引表格数据。对于需要删除层次结构的表格数据中的部分级别的情况,我们可以使用remove_unused_levels()方法来实现。但是需要特别注意,如果需要删除最后一层次的话,我们需要使用reset_index()方法将最后一层次转换为一列数据进行保留。通过这些操作,我们可以轻松地操作多级索引表格数据。
极客笔记