Pandas 數據變形與重塑全面指南
1. 引言
在數據分析過程中,我們經常需要將數據從一種結構轉換為另一種結構,以適應不同的分析需求。Pandas 提供了豐富的數據變形與重塑功能,包括旋轉(pivot)、堆疊(stack)、融合(melt)等多種操作。本文將詳細介紹這些功能,并通過實際代碼示例展示如何使用它們。
2. 透視表操作 (pivot 和 pivot_table)
2.1 pivot 基礎操作
pivot
用于將長格式數據轉換為寬格式。
import pandas as pd
import numpy as np# 創建示例數據
data = {'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],'Variable': ['A', 'B', 'A', 'B'],'Value': [10, 20, 30, 40]
}
df = pd.DataFrame(data)# 使用pivot進行重塑
pivot_df = df.pivot(index='Date', columns='Variable', values='Value')
print("Pivot結果:\n", pivot_df)
輸出:
Variable A B
Date
2023-01-01 10 20
2023-01-02 30 40
解釋:
index
: 指定作為行索引的列columns
: 指定作為列名的列values
: 指定填充值的列
2.2 pivot_table 高級透視
pivot_table
支持聚合功能,適合處理重復值。
# 創建有重復值的數據
data = {'Date': ['2023-01-01', '2023-01-01', '2023-01-01', '2023-01-02'],'Variable': ['A', 'B', 'A', 'B'],'Value': [10, 20, 30, 40]
}
df = pd.DataFrame(data)# 使用pivot_table進行聚合
pivot_table_df = pd.pivot_table(df, values='Value', index='Date', columns='Variable', aggfunc=np.mean)
print("\nPivot Table結果:\n", pivot_table_df)
輸出:
Value A B
Date
2023-01-01 20 20
2023-01-02 NaN 40
解釋:
aggfunc
: 指定聚合函數,默認為np.mean
- 可以處理重復值,對相同索引和列的組合進行聚合
3. 堆疊與反堆疊 (stack 和 unstack)
3.1 stack 操作
stack
將列轉換為行,產生多級索引。
# 創建寬格式數據
wide_df = pd.DataFrame({'A': [1, 2],'B': [3, 4],'C': [5, 6]
}, index=['X', 'Y'])# 使用stack進行堆疊
stacked = wide_df.stack()
print("\nStack結果:\n", stacked)
輸出:
X A 1B 3C 5
Y A 2B 4C 6
dtype: int64
3.2 unstack 操作
unstack
是 stack
的逆操作,將行轉換為列。
# 使用unstack進行反堆疊
unstacked = stacked.unstack()
print("\nUnstack結果:\n", unstacked)
輸出:
A B C
X 1 3 5
Y 2 4 6
4. 融合與寬變長 (melt 和 wide_to_long)
4.1 melt 操作
melt
將寬格式數據轉換為長格式。
# 創建寬格式數據
wide_df = pd.DataFrame({'ID': [1, 2],'Name': ['Alice', 'Bob'],'Math': [90, 85],'Physics': [80, 75]
})# 使用melt進行融合
melted = pd.melt(wide_df, id_vars=['ID', 'Name'], value_vars=['Math', 'Physics'],var_name='Subject', value_name='Score')
print("\nMelt結果:\n", melted)
輸出:
ID Name Subject Score
0 1 Alice Math 90
1 2 Bob Math 85
2 1 Alice Physics 80
3 2 Bob Physics 75
4.2 wide_to_long 操作
wide_to_long
是更靈活的寬變長轉換方法。
# 創建復雜寬格式數據
wide_df = pd.DataFrame({'ID': [1, 2],'Name': ['Alice', 'Bob'],'Score_Math_2022': [90, 85],'Score_Physics_2022': [80, 75],'Score_Math_2023': [95, 88],'Score_Physics_2023': [85, 78]
})# 使用wide_to_long進行轉換
long_df = pd.wide_to_long(wide_df, stubnames=['Score'], i=['ID', 'Name'], j='Year', sep='_', suffix='\\w+')
print("\nWide to Long結果:\n", long_df)
5. 虛擬變量轉換 (get_dummies 和 from_dummies)
5.1 get_dummies 操作
get_dummies
將分類變量轉換為虛擬/指示變量。
# 創建分類數據
df = pd.DataFrame({'Color': ['Red', 'Blue', 'Green', 'Blue', 'Red']
})# 使用get_dummies進行轉換
dummies = pd.get_dummies(df, columns=['Color'])
print("\nGet Dummies結果:\n", dummies)
輸出:
Color_Blue Color_Green Color_Red
0 0 0 1
1 1 0 0
2 0 1 0
3 1 0 0
4 0 0 1
5.2 from_dummies 操作
from_dummies
是 get_dummies
的逆操作。
# 使用from_dummies還原分類變量
from_dummies_df = pd.from_dummies(dummies, sep='_')
print("\nFrom Dummies結果:\n", from_dummies_df)
6. 爆炸操作 (explode)
explode
將列表形式的元素拆分為多行。
# 創建包含列表的數據
df = pd.DataFrame({'ID': [1, 2],'Items': [['A', 'B'], ['C', 'D', 'E']]
})# 使用explode進行爆炸
exploded = df.explode('Items')
print("\nExplode結果:\n", exploded)
輸出:
ID Items
0 1 A
0 1 B
1 2 C
1 2 D
1 2 E
7. 交叉表 (crosstab)
crosstab
計算兩個或多個因素的簡單交叉表。
# 創建示例數據
data = {'Gender': ['Male', 'Female', 'Male', 'Female', 'Male'],'Preference': ['Yes', 'No', 'Yes', 'Yes', 'No']
}
df = pd.DataFrame(data)# 使用crosstab創建交叉表
cross_tab = pd.crosstab(df['Gender'], df['Preference'])
print("\nCrosstab結果:\n", cross_tab)
輸出:
Preference No Yes
Gender
Female 1 1
Male 1 2
8. 分箱操作 (cut)
cut
將連續變量離散化為區間。
# 創建連續數據
ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]# 使用cut進行分箱
bins = [18, 25, 35, 60, 100]
labels = ['18-25', '26-35', '36-60', '61+']
age_groups = pd.cut(ages, bins=bins, labels=labels)
print("\nCut結果:\n", age_groups)
9. 因子化操作 (factorize)
factorize
將分類變量編碼為數值。
# 創建分類數據
colors = ['red', 'blue', 'green', 'blue', 'red']# 使用factorize進行編碼
codes, uniques = pd.factorize(colors)
print("\nFactorize結果:")
print("編碼:", codes)
print("唯一值:", uniques)
輸出:
編碼: [0 1 2 1 0]
唯一值: ['red' 'blue' 'green']
10. 總結
-
透視表操作:
pivot
: 簡單的長轉寬操作,不支持聚合pivot_table
: 支持聚合的透視表,適合處理重復值
-
堆疊操作:
stack
: 將列轉換為行,產生多級索引unstack
: 將行轉換為列,是stack的逆操作
-
融合操作:
melt
: 將寬格式數據轉換為長格式wide_to_long
: 更靈活的寬變長轉換方法
-
虛擬變量轉換:
get_dummies
: 將分類變量轉換為虛擬變量from_dummies
: 將虛擬變量轉換回分類變量
-
爆炸操作:
explode
: 將列表形式的元素拆分為多行
-
交叉表:
crosstab
: 計算兩個或多個因素的簡單交叉表
-
分箱操作:
cut
: 將連續變量離散化為區間
-
因子化操作:
factorize
: 將分類變量編碼為數值
選擇合適的數據變形方法取決于:
- 數據的原始結構和目標結構
- 是否需要聚合操作
- 是否需要處理重復值或列表數據
掌握這些數據變形與重塑技術將大大提高你在實際數據分析工作中的效率和靈活性,使你能輕松應對各種數據格式轉換需求。