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 中非常重要的數據重塑工具之一。