在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的stack
和reset_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,并且每一行包含了一条记录的所有信息。
具体步骤如下:
- 使用
stack
方法将MultiIndex中的最外层(level=0)进行堆叠,形成一个新的Series。这时候,在新Series的Index中,原来的第一层MultiIndex被堆叠起来,变成了新Series的两层Index。 - 用
reset_index
方法将新Series转化为DataFrame。这时候,在转化后的DataFrame中,新的两层Index变成了两个新的列,而原来的数据则是新DataFrame的最后一列。 - 对新的DataFrame的列名进行调整,以符合要求。
值得注意的是,扁平化MultiIndex后,如果Index的维度有重复值,这些重复值并不会被默认合并,这需要在数据处理过程中使用其他方法来处理。