DataFrame.stack(level=- 1, dropna=True) [source]
从列到索引堆叠指定级别。
返回一个经过重整的DataFrame
或Series
,与当前DataFrame
相比,该DataFrame
或Series
具有一个或多个新的最内层的多层索引。通过旋转当前DataFrame
的列来创建新的最内层:
1) 如果列具有单个级别,则输出为Series
;
2) 如果列具有多个级别,则新索引级别取自指定级别,并且输出为DataFrame
。
参数: | level : 从列轴堆叠到索引轴,定义为一个索引或标签, 或一列索引或标签。 dropna : 是否删除结果 将列级堆叠到索引轴上, 可以创建原始dataframe中缺少的索引和列值的组合。 看到部分例子。 |
返回值: | DataFrame 或 Series Stacked dataframe 或 series. |
Notes
该函数以类推的方式命名,其含义是将书籍的集合从水平位置(dataframe的列)并排排列成彼此垂直堆叠(在dataframe的索引中)。
例子
单级列
>>> df_single_level_cols = pd.DataFrame([[0, 1], [2, 3]],
... index=['cat', 'dog'],
... columns=['weight', 'height'])
将数据框与单个级别的列轴堆叠会返回一个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
多级列:简单案例
>>> 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