mars.dataframe.DataFrame.stack#

DataFrame.stack(level=-1, dropna=True)#

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

返回一个重新形状的 DataFrame 或 Series,具有与当前 DataFrame 相比一个或多个新的最内层级别的多级索引。新的最内层级别是通过透视当前数据框的列创建的:

  • 如果列只有一个级别,则输出为一个系列;

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

Parameters
  • level (int, str, list, 默认值 -1) – 从列轴堆叠到索引轴的级别,定义为一个索引或标签,或索引或标签的列表。

  • dropna (bool, 默认是 True) – 是否删除结果 Frame/Series 中缺失值的行。在索引轴上堆叠列级可能会创建原始数据框中缺失的索引和列值的组合。请参见示例部分。

Returns

堆叠的数据框或序列。

Return type

DataFrameSeries

另请参阅

DataFrame.unstack

将规定的级别从索引轴解压到列轴。

DataFrame.pivot

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

DataFrame.pivot_table

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

备注

该函数的名称是类比于一组书籍的重新组织,从并排放置在水平位置(数据框的列)转变为垂直堆叠在一起(在数据框的索引中)。

示例

单层列

>>> import mars.dataframe as md
>>> df_single_level_cols = md.DataFrame([[0, 1], [2, 3]],
...                                     index=['cat', 'dog'],
...                                     columns=['weight', 'height'])

将具有单层列轴的数据框堆叠将返回一个系列:

>>> df_single_level_cols.execute()
     weight height
cat       0      1
dog       2      3
>>> df_single_level_cols.stack().execute()
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 = md.DataFrame([[1, 2], [2, 4]],
...                                     index=['cat', 'dog'],
...                                     columns=multicol1)

使用多级列轴堆叠数据框:

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

缺失值

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

在堆叠具有多层列的数据框时,缺失值是很常见的,因为堆叠的数据框通常比原始数据框具有更多的值。缺失值用NaNs填充:

>>> df_multi_level_cols2.execute()
    weight height
        kg      m
cat    1.0    2.0
dog    3.0    4.0
>>> df_multi_level_cols2.stack().execute()
        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).execute()
             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]).execute()
cat  height  m     2.0
     weight  kg    1.0
dog  height  m     4.0
     weight  kg    3.0
dtype: float64

删除缺失值

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

注意,默认情况下,所有值都缺失的行会被删除,但这种行为可以通过dropna关键字参数进行控制:

>>> df_multi_level_cols3.execute()
    weight height
        kg      m
cat    NaN    1.0
dog    2.0    3.0
>>> df_multi_level_cols3.stack(dropna=False).execute()
        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).execute()
        height  weight
cat m      1.0     NaN
dog kg     NaN     2.0
    m      3.0     NaN