pandas.DataFrame.stack#

DataFrame.stack(level=- 1, dropna=True)[源代码]#

从列到索引堆叠规定的级别。

返回重塑的DataFrame或Series,该DataFrame或Series具有与当前DataFrame相比具有一个或多个新的最内部级别的多级索引。通过旋转当前数据帧的列来创建新的最内部级别:

  • 如果列只有一个标高,则输出为系列;

  • 如果列有多个级别,则从指定的级别中获取新的索引级别,并且输出为DataFrame。

参数
level整型、字符串、列表、缺省值-1

级别:从列轴堆叠到索引轴上,定义为一个索引或标签,或一组索引或标签。

dropna布尔值,默认为True

是否删除结果帧/系列中缺少值的行。将列级别堆叠到索引轴上可以创建原始数据帧中缺少的索引值和列值的组合。请参见示例部分。

退货
DataFrame或系列

堆叠的数据帧或系列。

参见

DataFrame.unstack

将指定级别从索引轴取消堆叠到列轴。

DataFrame.pivot

将数据帧从长格式重塑为宽格式。

DataFrame.pivot_table

将电子表格样式的数据透视表创建为DataFrame。

注意事项

该函数的命名类似于图书集合从在水平位置(数据帧的列)上并排排列到垂直堆叠在彼此的顶部(在数据帧的索引中)。

参考文献 the user guide 查看更多示例。

示例

单层柱

>>> df_single_level_cols = pd.DataFrame([[0, 1], [2, 3]],
...                                     index=['cat', 'dog'],
...                                     columns=['weight', 'height'])

使用单个级别列轴堆叠数据帧将返回一个系列:

>>> df_single_level_cols
     weight height
cat       0      1
dog       2      3
>>> df_single_level_cols.stack()
cat  weight    0
     height    1
dog  weight    2
     height    3
dtype: int64

多标高柱:简单情况

>>> multicol1 = pd.MultiIndex.from_tuples([('weight', 'kg'),
...                                        ('weight', 'pounds')])
>>> df_multi_level_cols1 = pd.DataFrame([[1, 2], [2, 4]],
...                                     index=['cat', 'dog'],
...                                     columns=multicol1)

使用多层列轴堆叠数据帧:

>>> df_multi_level_cols1
     weight
         kg    pounds
cat       1        2
dog       2        4
>>> df_multi_level_cols1.stack()
            weight
cat kg           1
    pounds       2
dog kg           2
    pounds       4

缺少值

>>> multicol2 = pd.MultiIndex.from_tuples([('weight', 'kg'),
...                                        ('height', 'm')])
>>> df_multi_level_cols2 = pd.DataFrame([[1.0, 2.0], [3.0, 4.0]],
...                                     index=['cat', 'dog'],
...                                     columns=multicol2)

在堆叠具有多层列的数据帧时,缺少值是很常见的,因为堆叠的数据帧通常比原始数据帧具有更多的值。缺少的值由NAN填充:

>>> df_multi_level_cols2
    weight height
        kg      m
cat    1.0    2.0
dog    3.0    4.0
>>> df_multi_level_cols2.stack()
        height  weight
cat kg     NaN     1.0
    m      2.0     NaN
dog kg     NaN     3.0
    m      4.0     NaN

规定要堆叠的水平

第一个参数控制堆叠哪些级别或哪些级别:

>>> df_multi_level_cols2.stack(0)
             kg    m
cat height  NaN  2.0
    weight  1.0  NaN
dog height  NaN  4.0
    weight  3.0  NaN
>>> df_multi_level_cols2.stack([0, 1])
cat  height  m     2.0
     weight  kg    1.0
dog  height  m     4.0
     weight  kg    3.0
dtype: float64

正在删除缺少的值

>>> df_multi_level_cols3 = pd.DataFrame([[None, 1.0], [2.0, 3.0]],
...                                     index=['cat', 'dog'],
...                                     columns=multicol2)

请注意,缺省情况下会删除缺少所有值的行,但可以通过Dropna关键字参数控制此行为:

>>> df_multi_level_cols3
    weight height
        kg      m
cat    NaN    1.0
dog    2.0    3.0
>>> df_multi_level_cols3.stack(dropna=False)
        height  weight
cat kg     NaN     NaN
    m      1.0     NaN
dog kg     NaN     2.0
    m      3.0     NaN
>>> df_multi_level_cols3.stack(dropna=True)
        height  weight
cat m      1.0     NaN
dog kg     NaN     2.0
    m      3.0     NaN