📌  相关文章
📜  如何展平 Pandas DataFrame 列中的分层索引?(1)

📅  最后修改于: 2023-12-03 14:53:05.332000             🧑  作者: Mango

如何展平 Pandas DataFrame 列中的分层索引?

在 Pandas DataFrame 中,有时候数据的列索引会使用分层(多重)索引来组织数据,这样可以更好地组织和管理数据。但这会使得 DataFrame 显示略显复杂,不方便查看和处理,因此我们需要将其展平。

下面介绍几种常用的展平方式。

方法一:使用 reset_index()

reset_index() 函数可以将分层索引的多个层级都转化为列,进而将 DataFrame 展平。

import pandas as pd

# 创建一个带有两个层级的 DataFrame
df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [4, 5, 6],
    "C": [7, 8, 9]
})
df.columns = pd.MultiIndex.from_tuples([('Group1', 'A'), ('Group1', 'B'), ('Group2', 'C')])

# 展平 DataFrame
flat_df = df.reset_index()

运行结果如下所示:

  index Group1     Group2
          A  B     C
0     0     1  4     7
1     1     2  5     8
2     2     3  6     9

在前一列添加了一个新的 index 列,而原来的列索引变成了列的一部分。

方法二:使用 droplevel()

droplevel() 函数可以删除 DataFrame 列索引中的一个或多个层级,这样可以将 DataFrame 展平。

import pandas as pd

# 创建一个带有两个层级的 DataFrame
df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [4, 5, 6],
    "C": [7, 8, 9]
})
df.columns = pd.MultiIndex.from_tuples([('Group1', 'A'), ('Group1', 'B'), ('Group2', 'C')])

# 删除第一个层级
flat_df = df.droplevel(0, axis=1)

运行结果如下所示:

   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9

可以看到,原 DataFrame 的列索引中第一个层级已经被删除,DataFrame 被展平。

方法三:使用 unstack()

unstack() 函数可以将 DataFrame 中的一个分层索引层级转移为行索引层级,进而将 DataFrame 展平。

import pandas as pd

# 创建一个带有两个层级的 DataFrame
df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [4, 5, 6],
    "C": [7, 8, 9]
})
df.columns = pd.MultiIndex.from_tuples([('Group1', 'A'), ('Group1', 'B'), ('Group2', 'C')])

# 将第一个层级转移到行索引中
flat_df = df.unstack(level=0)

运行结果如下所示:

     A  B  C
0    1  4  7
1    2  5  8
2    3  6  9

可以看到,原 DataFrame 列索引中的第一个层级被转移为了行索引,DataFrame 被展平。

方法四:使用 stack()

stack() 函数可以将 DataFrame 中的一个行索引层级转移为分层索引层级,进而将 DataFrame 展平。

import pandas as pd

# 创建一个带有两个层级的 DataFrame
df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [4, 5, 6],
    "C": [7, 8, 9]
})
df.columns = pd.MultiIndex.from_tuples([('Group1', 'A'), ('Group1', 'B'), ('Group2', 'C')])

# 将行索引中的第一个层级转移到列索引中
flat_df = df.stack(level=0)

运行结果如下所示:

      A  B  C
0 Group1  1  4  7
1 Group1  2  5  8
2 Group1  3  6  9

可以看到,原 DataFrame 行索引中的第一个层级被转移为了列索引,DataFrame 被展平。