Python Pandas 數據分組 pd.groupby 的相關操作(一)
Pandas 數據分組 pd.groupby 的相關操作(一)
數據準備
import pandas as pd
# 假設有 5 個人,分別參加了 4 門課程,獲得了對應的分數
# 同時這個 5 個人分別負責的項目個數 在 'Project_num' 列中顯示
data = {'Math_A' : [1.1, 2.2, 3.3, 4.4, 1.1, 3.2, 2.4, 1.5, 4.3, 4.5],
'English_A' : [3, 2.6, 2, 1.7, 3, 3.3, 4.4, 5, 3.2, 2.4],
'Math_B' : [1.7, 2.5, 3.6, 2.4, 1.7, 2.2, 3.3, 4.4, 1.5, 4.3],
'English_B' : [5, 2.6, 2.4, 1.3, 5, 3.6, 2.4, 5, 2.2, 3.1],
'Project_num' : [2, 3, 0, 1, 2, 2, 1, 0, 3, 4],
'Sex' : ['F', 'M', 'M', 'F', 'F', 'F', 'M', 'M', 'F', 'M']
}
# 在額外設定 index 的時候,這裡不要用 pd.Series,直接用 列表,否則會出問題
index = pd.MultiIndex.from_tuples([('Group_1','Alice'),('Group_1','Bob'),('Group_1','Cathy'),('Group_1','Dany'),
('Group_2', 'Alice'),('Group_2', 'Ford'),('Group_2', 'Gary'),
('Group_2', 'Ham'),('Group_2', 'Ico'),('Group_2', 'Jack')],
names=['Group','Name'])
df = pd.DataFrame(data,index)
print(df)
運行結果:
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_1 Alice 1.1 3.0 1.7 5.0 2 F
Bob 2.2 2.6 2.5 2.6 3 M
Cathy 3.3 2.0 3.6 2.4 0 M
Dany 4.4 1.7 2.4 1.3 1 F
Group_2 Alice 1.1 3.0 1.7 5.0 2 F
Ford 3.2 3.3 2.2 3.6 2 F
Gary 2.4 4.4 3.3 2.4 1 M
Ham 1.5 5.0 4.4 5.0 0 M
Ico 4.3 3.2 1.5 2.2 3 F
Jack 4.5 2.4 4.3 3.1 4 M
一、分組並統計各組數量 df.groupby().size()
1.1 按列內元素進行分組 df.groupby(by=’label’)
print(df.groupby(by='Sex').size())
# 對性別這一列進行分組統計數量
運行結果:
Sex
F 5
M 5
dtype: int64
1.2 按 index 做分組 df.groupby(level=0)
print(df.groupby(level=0).size())
# 對第一層的 index 做分組 統計數量,分別顯示兩組的數量
print(df.groupby(level=1).size())
# 對第二層的 incex 做分組 統計數量,這裡 Alice 同時隸屬於 2 個小組
# 如果只有一層 index ,那 level 只能取 0
運行結果:
Group
Group_1 4
Group_2 6
dtype: int64
Name
Alice 2
Bob 1
Cathy 1
Dany 1
Ford 1
Gary 1
Ham 1
Ico 1
Jack 1
dtype: int64
二、分組顯示(類似迭代器)
2.1 針列不同元素進行分組顯示
for index, data in df.groupby(by='Sex'):
# 對不同性別進行分組顯示
print(index)
print(data)
print('\n')
運行結果:
F
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_1 Alice 1.1 3.0 1.7 5.0 2 F
Dany 4.4 1.7 2.4 1.3 1 F
Group_2 Alice 1.1 3.0 1.7 5.0 2 F
Ford 3.2 3.3 2.2 3.6 2 F
Ico 4.3 3.2 1.5 2.2 3 F
M
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_1 Bob 2.2 2.6 2.5 2.6 3 M
Cathy 3.3 2.0 3.6 2.4 0 M
Group_2 Gary 2.4 4.4 3.3 2.4 1 M
Ham 1.5 5.0 4.4 5.0 0 M
Jack 4.5 2.4 4.3 3.1 4 M
2.2 對 index 的不同項目進行分組顯示
for index, data in df.groupby(level=0):
# 對第一層 index 即不同的 Group 進行分組顯示
print(index)
print(data)
print('\n')
運行結果:
Group_1
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_1 Alice 1.1 3.0 1.7 5.0 2 F
Bob 2.2 2.6 2.5 2.6 3 M
Cathy 3.3 2.0 3.6 2.4 0 M
Dany 4.4 1.7 2.4 1.3 1 F
Group_2
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_2 Alice 1.1 3.0 1.7 5.0 2 F
Ford 3.2 3.3 2.2 3.6 2 F
Gary 2.4 4.4 3.3 2.4 1 M
Ham 1.5 5.0 4.4 5.0 0 M
Ico 4.3 3.2 1.5 2.2 3 F
Jack 4.5 2.4 4.3 3.1 4 M
2.3 針對多列進行疊加分組顯示
df_gb = df.groupby(['Sex', 'Project_num'])
# 對性別分組,和負責項目數量分組,進行疊加顯示
for (index_1, index_2), data in df_gb:
print((index_1, index_2))
print(data)
print('\n')
運行結果:
('F', 1)
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_1 Dany 4.4 1.7 2.4 1.3 1 F
('F', 2)
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_1 Alice 1.1 3.0 1.7 5.0 2 F
Group_2 Alice 1.1 3.0 1.7 5.0 2 F
Ford 3.2 3.3 2.2 3.6 2 F
('F', 3)
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_2 Ico 4.3 3.2 1.5 2.2 3 F
('M', 0)
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_1 Cathy 3.3 2.0 3.6 2.4 0 M
Group_2 Ham 1.5 5.0 4.4 5.0 0 M
('M', 1)
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_2 Gary 2.4 4.4 3.3 2.4 1 M
('M', 3)
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_1 Bob 2.2 2.6 2.5 2.6 3 M
('M', 4)
Math_A English_A Math_B English_B Project_num Sex
Group Name
Group_2 Jack 4.5 2.4 4.3 3.1 4 M