# pandas.DataFrame.stack

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

  Stack the prescribed level(s) from columns to index.

  Return a reshaped DataFrame or Series having a multi-level index with one or more new inner-most levels compared to the current DataFrame. The new inner-most levels are created by pivoting the columns of the current dataframe:

  > - if the columns have a single level, the output is a Series;
  > - if the columns have multiple levels, the new index level(s) is (are) taken from the prescribed level(s) and the output is a DataFrame.

  The new index levels are sorted.

  Parameters:

  level : int, str, list, default -1

  > Level(s) to stack from the column axis onto the index axis, defined as one index or label, or a list of indices or labels.

  dropna : bool, default True

  > Whether to drop rows in the resulting Frame/Series with missing values. Stacking a column level onto the index axis can create combinations of index and column values that are missing from the original dataframe. See Examples section.

  Returns:

  DataFrame or Series

  > Stacked dataframe or series.

  See also

  `DataFrame.unstack`
    Unstack prescribed level(s) from index axis onto column axis.
  `DataFrame.pivot`
    Reshape dataframe from long format to wide format.
  `DataFrame.pivot_table`
    Create a spreadsheet-style pivot table as a DataFrame.

  Notes

  The function is named by analogy with a collection of books being reorganized from being side by side on a horizontal position (the columns of the dataframe) to being stacked vertically on top of each other (in the index of the dataframe).

  Examples

  Single level columns

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

  Stacking a dataframe with a single level column axis returns a Series:

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

  Multi level columns: simple case

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

  Stacking a dataframe with a multi-level column axis:

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

  Missing values

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

  It is common to have missing values when stacking a dataframe with multi-level columns, as the stacked dataframe typically has more values than the original dataframe. Missing values are filled with NaNs:

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

  Prescribing the level(s) to be stacked

  The first parameter controls which level or levels are stacked:

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

  Dropping missing values

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

  Note that rows where all values are missing are dropped by default but this behaviour can be controlled via the dropna keyword parameter:

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

Scroll To Top