Pandas2.2 DataFrame
Reshaping sorting transposing
方法 | 描述 |
---|---|
DataFrame.droplevel(level[, axis]) | 用于**从 DataFrame 的索引(行或列)中删除指定层级(level)**的方法 |
DataFrame.pivot(*, columns[, index, values]) | 用于重塑 DataFrame 的结构的方法 |
DataFrame.pivot_table([values, index, …]) | 用于**创建透视表(pivot table)**的函数 |
DataFrame.reorder_levels(order[, axis]) | 用于重新排序多级索引(MultiIndex)的层级顺序的方法 |
DataFrame.sort_values(by, *[, axis, …]) | 用于按指定列或行的值对 DataFrame 进行排序的方法 |
DataFrame.sort_index(*[, axis, level, …]) | 用于按索引(行或列)对 DataFrame 进行排序的方法 |
DataFrame.nlargest(n, columns[, keep]) | 用于选取 DataFrame 中某列或多列的前 n 个最大值对应的行的方法 |
DataFrame.nsmallest(n, columns[, keep]) | 用于选取 DataFrame 中某列或多列的前 n 个最小值对应的行的方法 |
DataFrame.swaplevel([i, j, axis]) | 用于交换多级索引(MultiIndex)中两个层级的位置的方法 |
DataFrame.stack([level, dropna, sort, …]) | 用于将 DataFrame 的列索引“压入”行索引中,从而增加行数并减少列数的方法 |
pandas.DataFrame.stack()
pandas.DataFrame.stack(level=-1, dropna=<no_default>, sort=<no_default>, future_stack=False)
是一个用于将 DataFrame 的列索引“压入”行索引中,从而增加行数并减少列数的方法。它常用于将宽格式数据转换为长格式数据,是 unstack()
的反向操作。
📌 方法签名
DataFrame.stack(level=-1, dropna=True, sort=False, future_stack=False)
🔧 参数说明
参数 | 类型 | 说明 |
---|---|---|
level | int、str 或 list of int/str,默认 -1 (最后一级) | 要堆叠的列索引层级;默认只堆叠最内层 |
dropna | bool,默认 True | 是否删除结果中的 NaN 值 |
sort | bool,默认 False | 是否对新生成的 MultiIndex 进行排序 |
future_stack | bool,默认 False | 控制是否启用未来行为(Pandas 2.0+ 中可能默认为 True) |
✅ 返回值
- 返回一个新的
DataFrame
或Series
; - 如果堆叠后只剩一列,则返回
Series
; - 否则返回
DataFrame
; - 原始数据不会被修改。
🧪 示例代码及结果
示例 1:基本用法(单级列索引)
import pandas as pd# 创建一个普通 DataFrame
df = pd.DataFrame({'A': [1, 2],'B': [3, 4]
}, index=['row1', 'row2'])print("Original DataFrame:")
print(df)
输出:
A B
row1 1 3
row2 2 4
# stack() 将列变为行索引
stacked = df.stack()
print("\nAfter stack():")
print(stacked)
输出:
row1 A 1B 3
row2 A 2B 4
dtype: int64
结果是一个
Series
,具有多级索引。
示例 2:使用 dropna=False
保留缺失值
df_with_nan = pd.DataFrame({'A': [1, None],'B': [None, 4]
}, index=['row1', 'row2'])print("DataFrame with NaN:")
print(df_with_nan)
输出:
A B
row1 1.0 NaN
row2 NaN 4.0
# 不删除 NaN
stacked_with_nan = df_with_nan.stack(dropna=False)
print("\nAfter stack(dropna=False):")
print(stacked_with_nan)
输出:
row1 A 1.0B NaN
row2 A NaNB 4.0
dtype: float64
示例 3:堆叠多级列索引(MultiIndex)
# 创建一个多级列索引 DataFrame
arrays = [['X', 'X', 'Y', 'Y'],['a', 'b', 'a', 'b']
]
columns = pd.MultiIndex.from_arrays(arrays, names=('group', 'sub'))
df_multi_col = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], columns=columns)print("Original Multi-column DataFrame:")
print(df_multi_col)
输出:
group X Y
sub a b a b
0 1 2 3 4
1 5 6 7 8
# 默认堆叠最内层(sub)
stacked_inner = df_multi_col.stack()
print("\nAfter stack() (inner level):")
print(stacked_inner)
输出:
group X Y
0 sub a X 1 3b X 2 4
1 sub a X 5 7b X 6 8
注意:此时返回的是
DataFrame
,因为堆叠后仍有多列。
示例 4:指定堆叠外层索引(level=‘group’)
# 堆叠外层索引(group)
stacked_outer = df_multi_col.stack(level='group')
print("\nAfter stack(level='group'):")
print(stacked_outer)
输出:
sub a bgroup
0 X 1 2Y 3 4
1 X 5 6Y 7 8
此时
group
被压入行索引中。
示例 5:堆叠多个层级(level=[0, 1])
# 堆叠所有层级
stacked_all_levels = df_multi_col.stack(level=[0, 1])
print("\nAfter stack(level=[0, 1]):")
print(stacked_all_levels)
输出:
group sub value
0 X a 1X b 2Y a 3Y b 4
1 X a 5X b 6Y a 7Y b 8
注意:在某些版本中会自动添加
value
列名。
示例 6:设置 sort=True
对结果排序
# 设置 sort=True
stacked_sorted = df_multi_col.stack(sort=True)
print("\nAfter stack(sort=True):")
print(stacked_sorted)
输出(与前面类似,但索引已排序):
group X Y
0 sub a X 1 3b X 2 4
1 sub a X 5 7b X 6 8
索引按字典序排列。
🧠 应用场景
场景 | 说明 |
---|---|
重塑数据结构 | 将宽格式转为长格式,适合后续分析或绘图 |
准备时间序列数据 | 如将不同时间点的数据合并为一列 |
配合 groupby 使用 | 长格式更适合分组统计 |
可视化准备 | 准备适合绘制箱线图、折线图等的数据格式 |
⚠️ 注意事项
stack()
默认只堆叠最内层列索引;- 可通过
level
指定任意层级; dropna=True
会删除含NaN
的行;sort=True
会对新生成的MultiIndex
排序;- 堆叠后如果只剩一列,结果为
Series
; - 适用于行索引(
axis=0
),不支持列方向堆叠; future_stack=True
在 Pandas 2.0+ 中可能会成为默认行为。
✅ 总结对比
方法 | 是否推荐使用 | 说明 |
---|---|---|
stack() | ✅ 推荐 | 快速将列索引压入行索引 |
stack(level='name') | ✅ 推荐 | 使用层级名清晰直观 |
stack(level=0) | ✅ 推荐 | 快速按编号堆叠层级 |
stack(..., dropna=False) | ✅ 推荐 | 保留缺失值 |
stack(..., sort=True) | ✅ 推荐 | 自动排序索引 |
你可以根据实际需求选择堆叠哪些层级、是否删除缺失值、是否排序,从而灵活地将数据从“宽格式”转换为“长格式”,便于后续分析和可视化。它是 Pandas 中非常重要的数据重塑工具之一。