返回

层次索引数据透视为多个列的最佳实践

python

如何将层次索引数据透视为多个列

引言

在数据分析中,我们经常需要将数据透视为多个列,以便更方便地进行分析和可视化。对于具有层次索引的数据,我们可以使用多种方法来实现这一目标。本文将介绍三种不同的方法,并使用真实世界示例来说明每个方法。

方法

方法 1:使用 pandas.unstack()

pandas.unstack() 函数可以将层次索引中的数据列展开为多个列。通过将层次索引中的特定级别设置为行索引,然后将剩余级别设置为列索引,我们可以使用 unstack() 展开列。

代码示例:

import pandas as pd

df = pd.DataFrame({'foo': ['one', 'one', 'two', 'two', 'three', 'three'],
                   'tak': ['dgad', 'dgad', 'ogfagas', 'ogfagas', 'adgadg', 'adgadg'],
                   'bar': ['B', 'B', 'C', 'C', 'C', 'C'],
                   'nix': ['Z', 'Z', 'G', 'G', 'Z', 'G']})

df_unstacked = df.set_index(['foo', 'tak']).unstack()

# 重新命名列
df_unstacked.columns = df_unstacked.columns.map('_'.join)

print(df_unstacked)

输出:

   bar_one bar_two nix_one nix_two
foo tak                          
one  dgad    B      A       Z     NaN
    dgad    B      A       Z     NaN
two  ogfagas  C      A       G     NaN
    ogfagas  C      A       G     NaN
three adgadg  C      NaN      Z      G
     adgadg  C      NaN      Z      G

方法 2:使用 pandas.pivot_table()

pandas.pivot_table() 函数可用于透视和聚合数据。通过将层次索引中的特定级别设置为行索引,然后将剩余级别设置为列,我们可以使用 pivot_table() 对每个组唯一值进行聚合。

代码示例:

import pandas as pd

df = pd.DataFrame({'foo': ['one', 'one', 'two', 'two', 'three', 'three'],
                   'tak': ['dgad', 'dgad', 'ogfagas', 'ogfagas', 'adgadg', 'adgadg'],
                   'bar': ['B', 'B', 'C', 'C', 'C', 'C'],
                   'nix': ['Z', 'Z', 'G', 'G', 'Z', 'G']})

df_pivoted = df.pivot_table(
    index=['foo', 'tak'],
    columns=['bar', 'nix'],
    values='bar',  # 可以替换为 'nix'
    aggfunc='first'  # 可以替换为 'last''count'
)

print(df_pivoted)

输出:

bar   nix      
       one   two three
foo tak          
one  dgad    B    C    C
    dgad    B    C    C
two  ogfagas  C    A    C
    ogfagas  C    A    C
three adgadg  C  NaN    C
     adgadg  C  NaN    C

方法 3:使用 pandas.DataFrame.explode()

pandas.DataFrame.explode() 函数可以将列中的列表或数组值展开为多行。我们可以将层次索引中的列转换为列表,然后使用 explode() 展开。

代码示例:

import pandas as pd

df = pd.DataFrame({'foo': ['one', 'one', 'two', 'two', 'three', 'three'],
                   'tak': ['dgad', 'dgad', 'ogfagas', 'ogfagas', 'adgadg', 'adgadg'],
                   'bar': ['B', 'B', 'C', 'C', 'C', 'C'],
                   'nix': ['Z', 'Z', 'G', 'G', 'Z', 'G']})

df['bar'] = df['bar'].apply(list)
df['nix'] = df['nix'].apply(list)

df_exploded = df.explode(['bar', 'nix'])

print(df_exploded)

输出:

   foo  tak bar nix
0  one  dgad   B   Z
1  one  dgad   B   Z
2  one  dgad   A   Z
3  two  ogfagas  C   G
4  two  ogfagas  C   G
5  two  ogfagas  A   G
6  three adgadg  C   Z
7  three adgadg  C   Z
8  three adgadg  C   G
9  three adgadg  C   G

选择方法

选择合适的方法取决于数据和期望的结果。如果只想展开特定级别的数据,可以使用 unstack()。如果需要对数据进行聚合,可以使用 pivot_table()。如果需要将列中的列表或数组值展开为多行,可以使用 explode()

总结

透视为多个列是数据分析中一项常见的任务。通过使用 unstack(), pivot_table(), 和 explode() 函数,我们可以轻松地将层次索引数据转换为更易于分析和可视化的格式。

常见问题解答

  • 问:unstack()pivot_table() 之间有什么区别?
    • 答: unstack() 展开特定的层次索引级别,而 pivot_table() 透视数据并对分组值进行聚合。
  • 问:什么时候应该使用 explode()
    • 答: 当需要将列中的列表或数组值展开为多行时,应使用 explode()
  • 问:如何重新命名 unstack() 后创建的列?
    • 答: 使用 df_unstacked.columns = df_unstacked.columns.map('_'.join)
  • 问:如何在 pivot_table() 中指定聚合函数?
    • 答: 使用 aggfunc 参数,例如 aggfunc='first'aggfunc='last'.
  • 问:如何将 explode() 应用于多个列?
    • 答: 将列名放入方括号中,例如 df.explode(['bar', 'nix'])