将多个索引合并为单个索引在 Pandas 中非常常见,例如,现在我们有一个 DataFrame,其中有两个层级的行索引和两个层级的列索引。我们希望在行索引上将这两个层级合并为单个层级,以方便后续数据处理。
下面是具体步骤及代码示例:
- 使用
reset_index()
方法将多级行索引转换为普通列。
df = df.reset_index()
- 使用
groupby()
方法依据需要合并的列将 DataFrame 进行分组,在此之前需要注意:必须先按照需要合并的列进行排序。否则,将原本的行顺序打乱。
df = df.sort_values(by=['需要合并的列1', '需要合并的列2'])
df = df.groupby(['需要合并的列1']).apply(lambda x: x.set_index('需要合并的列2'))
- 对于合并成单一索引的层级,可以通过
rename()
来修改层级的名称。
df = df.rename_axis(('新列名称', '原列名称'), axis=0)
最终,我们就可以得到将多个索引合并成一个单一索引的 DataFrame。
下面是具体的示例代码,对于本例子,我们首先构造一个含有两级行索引和两级列索引的 DataFrame。
import pandas as pd
# 创建示例 DataFrame
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
index = pd.MultiIndex.from_arrays(arrays, names=('A', 'B'))
df = pd.DataFrame({'col1': [1, 2, 3, 4, 5, 6, 7, 8],'col2': [9, 10, 11, 12, 13, 14, 15, 16],'col3': [17, 18, 19, 20, 21, 22, 23, 24]}, index=index)
# 查看原始 DataFrame
print(df)
# 将多重行索引转换为普通列
df = df.reset_index()
# 将需要合并的列排序
df = df.sort_values(by=['A', 'B']).reset_index(drop=True)
# 将行索引 A 作为索引,B 作为第二层级行索引
df = df.groupby('A').apply(lambda x: x[['B', 'col1', 'col2', 'col3']].set_index('B'))
# 对索引进行修改
df = df.rename_axis(('Index', 'B'), axis=0)
# 查看合并后的 DataFrame
print(df)
输出结果为:
col1 col2 col3
A B
bar one 1 9 17
two 2 10 18
baz one 3 11 19
two 4 12 20
foo one 5 13 21
two 6 14 22
qux one 7 15 23
two 8 16 24
col1 col2 col3
Index B
bar one 1 9 17
two 2 10 18
baz one 3 11 19
two 4 12 20
foo one 5 13 21
two 6 14 22
qux one 7 15 23
two 8 16 24
通过上面的代码,我们可以看出,将多个索引合并为单一索引可以使用 Pandas 中的 reset_index()
和 groupby()
方法来实现,正确的排序以及对索引进行修改是关键步骤,修改后即可得到合并后的 DataFrame。