在Pandas系列中把多索引串联成单一索引

  • Post category:Python

将多个索引合并为单个索引在 Pandas 中非常常见,例如,现在我们有一个 DataFrame,其中有两个层级的行索引和两个层级的列索引。我们希望在行索引上将这两个层级合并为单个层级,以方便后续数据处理。

下面是具体步骤及代码示例:

  1. 使用 reset_index() 方法将多级行索引转换为普通列。
df = df.reset_index()
  1. 使用 groupby() 方法依据需要合并的列将 DataFrame 进行分组,在此之前需要注意:必须先按照需要合并的列进行排序。否则,将原本的行顺序打乱。
df = df.sort_values(by=['需要合并的列1', '需要合并的列2'])
df = df.groupby(['需要合并的列1']).apply(lambda x: x.set_index('需要合并的列2'))
  1. 对于合并成单一索引的层级,可以通过 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。