Pandas - Reshaping Data
一、案例數據準備
import pandas as pd
# 這裏假設我們有 5 個人,每個人有 2 種屬性數據,共 15 個元素
d = {'name' : pd.Series(['a', 'b', 'c', 'd','e'], index=[0,1,2,3,4]),
'attri_1' : pd.Series([1.1, 2.2, 3.3, 4.4,5.5], index=[0,1,2,3,4]),
'attri_2' : pd.Series([1, 2, 3, 4, 5], index=[0,1,2,3,4])
}
df = pd.DataFrame(d)
print(df)
運行結果:
name attri_1 attri_2
0 a 1.1 1
1 b 2.2 2
2 c 3.3 3
3 d 4.4 4
4 e 5.5 5
二、將所有數據展開,匯聚到行顯示
2.1 全展開
df_2 = df.melt()
# 將 5 行 3 列的數據轉化爲 每行 1 個數據,即 15 行數據
# 每一行有 index,variable(原列標籤),value(原列中的各個值)
# 這裏的顯示錶示,我們想要看到所有的 5 個 人名, 5 個 屬性_1 的值, 5個 屬性_2 的值
print(df_2)
運行結果:
variable value
0 name a
1 name b
2 name c
3 name d
4 name e
5 attri_1 1.1
6 attri_1 2.2
7 attri_1 3.3
8 attri_1 4.4
9 attri_1 5.5
10 attri_2 1
11 attri_2 2
12 attri_2 3
13 attri_2 4
14 attri_2 5
2.2 展開特定的列
df_3 = df.melt(id_vars=['name'], var_name = 'attri')
# 以第一列爲錨定,展開後面 2 列,10 種組合
# 我們想查看 5 個人的 屬性_1 分佈,和 屬性_2 分佈
print(df_3)
運行結果:
name attri value
0 a attri_1 1.1
1 b attri_1 2.2
2 c attri_1 3.3
3 d attri_1 4.4
4 e attri_1 5.5
5 a attri_2 1.0
6 b attri_2 2.0
7 c attri_2 3.0
8 d attri_2 4.0
9 e attri_2 5.0
三、將匯聚的數據分散到列顯示(類似數據透視表)
df_4 = df_3.pivot(index='name',columns='attri',values='value')
# 這種功能類似於 數據透視表,這裏的 'name' 這列已經不再是一列,而是 index
print(df_4)
運行結果:
attri attri_1 attri_2
name
a 1.1 1.0
b 2.2 2.0
c 3.3 3.0
d 4.4 4.0
e 5.5 5.0
3.1 顯示其中一列
print(df_4['attri_1']) # 顯示 attri_1 這一列的元素
運行結果:
name
a 1.1
b 2.2
c 3.3
d 4.4
e 5.5
Name: attri_1, dtype: float64
3.2 顯示其中一行
print(df_4.loc['b']) # 顯示 'b' 這一行的元素
運行結果:
attri
attri_1 2.2
attri_2 2.0
Name: b, dtype: float64