为什么以及何时应该使用 stack() 和 unstack() 方法?

Med*_*din 5 python stack pandas data-science

我对这两种方法感到非常困惑: stack() 和 unstack() 我知道我应该在多索引的情况下使用它们,但是,我需要知道以下内容:

1- 我不知道应该在哪里使用 stack 或 unstack
2- 为什么我应该使用它们

当我使用“pivot”时,我理解的是pivot将Dataframe转换为unstack形式,如果这是正确的,我需要知道为什么当我使用以下行代码时它会引发错误:

data.stack(level=1) # IndexError: Too many levels: Index has only 1 level, not 2
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,它会运行:

data.unstack().stack(level=1)
Run Code Online (Sandbox Code Playgroud)

有时,我看到堆栈有像这样的 kwargs,level=-1 我不知道什么时候必须放置“-1”,这是什么意思

我知道我误解了很多东西,但我很困惑

那么,对于理解这些术语有什么帮助吗?

提前谢谢

moz*_*way 6

pivot这是对和之间差异的规范回答的尝试unstack。有关重塑的完整指南,必须阅读pandas 关于重塑和数据透视表的官方文档。

pivot并unstack执行大致相同的操作,但它们在不同的逻辑级别上操作:分别是列和索引级别。

我将使用此示例数据框作为输入:

df = pd.DataFrame({'col1': list('ABCABC'),
                   'col2': list('aaabbb'),
                   'col3': list('uvwxyz'),
                  })
Run Code Online (Sandbox Code Playgroud)
  col1 col2 col3
0    A    a    u
1    B    a    v
2    C    a    w
3    A    b    x
4    B    b    y
5    C    b    z
Run Code Online (Sandbox Code Playgroud)

pivot在列上使用

pandas.DataFrame.pivot对列进行操作

注意。当index参数未使用时,它将使用当前索引。

df.pivot(index='col1', columns='col2', values='col3')
Run Code Online (Sandbox Code Playgroud)
col2  a  b
col1      
A     u  x
B     v  y
C     w  z
Run Code Online (Sandbox Code Playgroud)

unstack在多重索引上使用

无论输入是 Series 还是 DataFrame,这里都有两种用例。

pandas.Series.unstack

我们将首先从初始 DataFrame 生成一个具有 MultIndex 的 Series:

series = df.set_index(['col1', 'col2'])['col3']
Run Code Online (Sandbox Code Playgroud)
col1  col2
A     a       u
B     a       v
C     a       w
A     b       x
B     b       y
C     b       z
Name: col3, dtype: object
Run Code Online (Sandbox Code Playgroud)

我们看到数据与原始DataFrame非常相似,但col1现在col2是索引级别,并且数据本身现在是一维的(即,一个Series)

现在,我们可以unstack默认将最右边(最后一个)索引级别应用到透视表作为列来生成 DataFrame。有多种方法可以指定要取消堆叠的索引级别,因此所有这些选项都是等效的:

series.unstack()
Run Code Online (Sandbox Code Playgroud)
series.unstack('col2') # by level name
Run Code Online (Sandbox Code Playgroud)
series.unstack(1) # by level position from the left
Run Code Online (Sandbox Code Playgroud)
series.unstack(-1) # by level position from the end (-1 = last)
Run Code Online (Sandbox Code Playgroud)
col2  a  b
col1      
A     u  x
B     v  y
C     w  z
Run Code Online (Sandbox Code Playgroud)

这意味着df.pivot(index='col1', columns='col2', values='col3')和df.set_index(['col1', 'col2'])['col3'].unstack()在逻辑上是等价的。

pandas.DataFrame.unstack

DataFrame 版本unstack与 Series 版本非常相似,不同之处在于,由于数据已经是二维的,因此它将为列创建额外的索引级别。

df.set_index(['col1', 'col2']).unstack(level='col2')
Run Code Online (Sandbox Code Playgroud)
     col3   
col2    a  b
col1        
A       u  x
B       v  y
C       w  z
Run Code Online (Sandbox Code Playgroud)

同样,pivot通过将列表封装的列名称传递给 ,可以使用 获得相同的输出values:

df.pivot(index='col1', columns='col2', values=['col3'])
Run Code Online (Sandbox Code Playgroud)
     col3   
col2    a  b
col1        
A       u  x
B       v  y
C       w  z
Run Code Online (Sandbox Code Playgroud)