看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas
的 stack()
方法用于将 DataFrame
的列索引转换为行索引,从而将宽表(列较多的表)转换为长表(行较多的表)。该方法对处理多级索引(MultiIndex)数据非常有用,尤其是在数据透视操作中。
将规定的级别从列堆叠到索引。
DataFrame.stack(
level: int | str | list[int | str] = -1,
dropna=_NoDefault.no_default,
sort=_NoDefault.no_default,
future_stack: bool = False
)
stack()
方法可以应用于任意类型的 DataFrame
,但在多级索引的情况下最为常见。它主要作用于具有多个列的 DataFrame
,并且可以处理数值型、字符串型、布尔型等各种数据类型。
返回具有多级索引的重塑DataFrame或Series,与当前DataFrame相比,该多级索引具有一个或多个新的最内层。通过旋转当前数据帧的列来创建新的最内层:
level:
int
、str
或 list[int | str]
-1
)。可以指定单个级别的索引或多个级别的索引进行堆叠。dropna:
bool
True
,则会删除生成的缺失值。默认值取决于 pandas
版本。如果不显式设置,pandas 会自动选择一个默认值。sort:
bool
True
,则按字典顺序对结果索引进行排序。默认值为 True
。future_stack:
bool
False
。通常用户无需关注此参数。是否使用新的实现来取代pandas 3.0中的当前实现。当为True时,dropna和sort对结果没有影响,必须保持未指定状态。Series
或 DataFrame
Series
或带有层级索引的 DataFrame
,根据输入 DataFrame
的结构决定。如果输入 DataFrame
是单级列索引,则返回 Series
;如果是多级列索引,则返回 DataFrame
。stack()
通常在需要将数据从宽表格式转换为长表格式时使用,比如在数据聚合、处理多级索引时非常有用。此外,stack()
经常与 unstack()
方法配合使用。
该函数的命名类似于将书籍集合从水平位置(数据帧的列)并排重组为垂直堆叠(在数据帧的索引中)。
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(future_stack=True)
'''
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(future_stack=True)
'''
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(future_stack=True)
'''
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, future_stack=True)
'''
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], future_stack=True)
'''
cat weight kg 1.0
height m 2.0
dog weight kg 3.0
height m 4.0
dtype: float64
'''
下面通过几个例子来说明 stack()
的使用。
假设有一个简单的 DataFrame
,其中每一行表示一个学生的成绩。
import pandas as pd
# 构造示例数据
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Math': [85, 92, 88],
'English': [78, 81, 95]
}
df = pd.DataFrame(data)
# 输出构造的数据
print(df)
# 将列堆叠为行
stacked_df = df.set_index('Name').stack()
# 输出结果
print(stacked_df)
输出:
Name Math English
0 Alice 85 78
1 Bob 92 81
2 Charlie 88 95
Name
Alice Math 85
English 78
Bob Math 92
English 81
Charlie Math 88
English 95
dtype: int64
在这个例子中,stack()
方法将 Math
和 English
这两个列转换为行,使得每个学生的成绩按科目分开显示。
在一些复杂的情况下,可能需要处理多级列索引的 DataFrame
。例如,我们有一个 DataFrame
,其中记录了不同时间的温度和湿度。
import pandas as pd
# 构造示例数据
data = {
('Temperature', 'Morning'): [15, 12],
('Temperature', 'Afternoon'): [20, 18],
('Humidity', 'Morning'): [80, 82],
('Humidity', 'Afternoon'): [60, 65]
}
df = pd.DataFrame(data, index=['Day 1', 'Day 2'])
# 输出构造的数据
print(df)
# 将多级列索引堆叠为行
stacked_df = df.stack()
# 输出结果
print(stacked_df)
输出:
Temperature Humidity
Morning Afternoon Morning Afternoon
Day 1 15 20 80 60
Day 2 12 18 82 65
Temperature Humidity
Day 1 Morning 15 80
Afternoon 20 60
Day 2 Morning 12 82
Afternoon 18 65
在这个例子中,stack()
方法将原本的多级列索引转换为行索引,方便进一步的分析或处理。
更新时间:Aug. 11, 2024, 10:49 a.m. 标签:pandas python stack 堆叠 转换