pandas.DataFrame.stack#

DataFrame.stack(level=-1, dropna=<no_default>, sort=<no_default>, future_stack=True)[源代码][源代码]#

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

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

  • 如果列只有一个级别,输出是一个 Series;

  • 如果列有多个级别,新的索引级别取自指定的级别,输出是一个 DataFrame。

参数:
级别int, str, list, default -1

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

dropna布尔值, 默认为 True

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

排序布尔值, 默认为 True

是否对生成的 MultiIndex 的级别进行排序。

future_stack布尔值, 默认为 True

是否使用将在 pandas 3.0 中替换当前实现的新实现。当为 True 时,dropna 和 sort 对结果没有影响,必须保持未指定。更多详情请参见 pandas 2.1.0 发行说明

返回:
DataFrame 或 Series

堆叠的数据框或系列。

参见

DataFrame.unstack

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

DataFrame.pivot

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

DataFrame.pivot_table

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

备注

这个函数的命名是类比于一堆书从并排水平放置(数据框的列)重新组织成垂直堆叠(数据框的索引)。

更多示例请参考 用户指南

示例

单级列

>>> 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
... )

在使用多级列堆叠数据框时,通常会出现缺失值,因为堆叠后的数据框通常比原始数据框有更多的值。缺失值用 NaNs 填充:

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

指定要堆叠的级别

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

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