如何在Pandas中扁平化MultiIndex

  • Post category:Python

在Pandas中,一个DataFrame或Series的Index可以有多个维度,称为MultiIndex。在处理数据时,我们可能需要将这个MultiIndex扁平化为单层Index,以方便后续操作。

下面是一个MultiIndex的示例:

import pandas as pd

# 创建一个MultiIndex的DataFrame
data = {
    ('fruit', 'apple'): [3, 2, 4, 1],
    ('fruit', 'orange'): [0, 5, 2, 1],
    ('drink', 'coffee'): [1, 3, 2, 3],
    ('drink', 'tea'): [5, 4, 3, 1]
}
df = pd.DataFrame(data, index=[0, 1, 2, 3])

print(df)

输出:

  fruit      drink    
  apple orange coffee tea
0     3      0      1   5
1     2      5      3   4
2     4      2      2   3
3     1      1      3   1

可以看到,这个DataFrame的Index是一个两层的MultiIndex。现在我们需要将它扁平化为单层Index,这时就可以运用Pandas的stackreset_index方法了。

# 将MultiIndex扁平化为单层Index
df_flat = df.stack(level=0)
df_flat.reset_index(level=[1, 2], inplace=True)
df_flat.columns = ['category', 'item', 'value']

print(df_flat)

输出:

  category    item  value
0    fruit   apple      3
1    fruit  orange      0
2    drink  coffee      1
3    drink     tea      5
4    fruit   apple      2
5    fruit  orange      5
6    drink  coffee      3
7    drink     tea      4
8    fruit   apple      4
9    fruit  orange      2
10   drink  coffee      2
11   drink     tea      3
12   fruit   apple      1
13   fruit  orange      1
14   drink  coffee      3
15   drink     tea      1

可以看到,MultiIndex已经被扁平化为单层Index,并且每一行包含了一条记录的所有信息。

具体步骤如下:

  1. 使用stack方法将MultiIndex中的最外层(level=0)进行堆叠,形成一个新的Series。这时候,在新Series的Index中,原来的第一层MultiIndex被堆叠起来,变成了新Series的两层Index。
  2. reset_index方法将新Series转化为DataFrame。这时候,在转化后的DataFrame中,新的两层Index变成了两个新的列,而原来的数据则是新DataFrame的最后一列。
  3. 对新的DataFrame的列名进行调整,以符合要求。

值得注意的是,扁平化MultiIndex后,如果Index的维度有重复值,这些重复值并不会被默认合并,这需要在数据处理过程中使用其他方法来处理。