返回 方法 1:使用
方法 2:使用
方法 3:使用
层次索引数据透视为多个列的最佳实践
python
2024-03-15 03:49:31
如何将层次索引数据透视为多个列
引言
在数据分析中,我们经常需要将数据透视为多个列,以便更方便地进行分析和可视化。对于具有层次索引的数据,我们可以使用多种方法来实现这一目标。本文将介绍三种不同的方法,并使用真实世界示例来说明每个方法。
方法
方法 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'])
。
- 答: 将列名放入方括号中,例如