Pandas-分組:df.groupby()
分組
根據研究目的,將所有樣本點按照一個或多個屬性劃分為多個組,就是分組。
pandas中,資料表就是DataFrame物件,分組就是
groupby方法
。將DataFrame中所有行按照一列或多列來劃分,分為多個組,
列值
相同的在同一組,列值不同的在不同組。
分組後,就得到一個
groupby物件
,代表著已經被分開的各個組。後續所有的動作,比如計數,求
平均值
等,都是針對這個物件,也就是都是針對各個組。即在每個組組內進行計數,求平均值等。
分組的返回結果
df = pd。DataFrame([[‘a’, ‘man’, 120, 90],
[‘b’, ‘woman’, 130, 100],
[‘a’, ‘man’, 110, 108],
[‘a’, ‘woman’, 120, 118]], columns=[‘level’, ‘gender’, ‘math’,‘chinese’])
group = df。groupby(‘gender’)
df。groupby() 函式返回的物件是一系列鍵值對,其中鍵是分組的欄位值,值是該欄位值下的資料表。分組的結果是無法直接輸出的,print()只能看到該結果的資料型別。可以用迴圈對分組後的結果進行遍歷。
print(group)
#
for key, value in group:
print(key)
print(value)
print(“”)
man
level gender math chinese
0 a man 120 90
2 a man 110 108
woman
level gender math chinese
1 b woman 130 100
3 a woman 120 118
按一列分組:
df。groupby
(column)
group = df。groupby(‘gender’) # 按照‘gender’列的值來分組,建立一個groupby物件
# group = df。groupby([‘gender’]) # 等價寫法
for key, df in group:
print(key)
print(df)
man
level gender math chinese
0 a man 120 90
2 a man 110 108
woman
level gender math chinese
1 b woman 130 100
3 a woman 120 118
按多列分組:df。groupby([column1, column2])
group = df。groupby([‘gender’, ‘level’])
# 先按照‘grade’列的值來分組。每組內,再按‘level’列來分組。也返回一個groupby物件
for key, value in group:
print(key)
print(value)
print(“”)
(‘man’, ‘a’)
level gender math chinese
0 a man 120 90
2 a man 110 108
(‘woman’, ‘a’)
level gender math chinese
3 a woman 120 118
(‘woman’, ‘b’)
level gender math chinese
1 b woman 130 100
檢視每組的統計資料:df。groupby(column)。describe()
對資料表中的數值列進行統計,給出包括count = 計數,mean =
平均數
,std = 方差,min = 最小值,25% = 四分位數,50% = 二分位數,75% = 四分之三分位數,max = 最大值的資訊。不會對非數值列統計。
返回的是一個dataframe。
檢視所有列的統計資訊
group = df。groupby([‘gender’])
df1 =
group。describe
()
# df1 = df。groupby([‘gender’])。describe() # 等價寫法
print(type(df1))
print(df1)
math chinese \
count mean std min 25% 50% 75% max count
gender
man 2。0 115。0 7。071068 110。0 112。5 115。0 117。5 120。0 2。0
woman 2。0 125。0 7。071068 120。0 122。5 125。0 127。5 130。0 2。0
mean std min 25% 50% 75% max
gender
man 99。0 12。727922 90。0 94。5 99。0 103。5 108。0
woman 109。0 12。727922 100。0 104。5 109。0 113。5 118。0
檢視指定列的統計資訊
group = df。groupby([‘gender’])
df1 = group。describe()[‘math’] # 只看math列的統計資訊
print(df1)
count mean std min 25% 50% 75% max
gender
man 2。0 115。0 7。071068 110。0 112。5 115。0 117。5 120。0
woman 2。0 125。0 7。071068 120。0 122。5 125。0 127。5 130。0
檢視
縱向檢視
unstack()可以將每列的統計資訊垂直排列。
group = df。groupby([‘gender’])
df1 = group。describe()。unstack()
print(df1)
gender
math count man 2。000000
woman 2。000000
。。。
max man 120。000000
woman 130。000000
chinese count man 2。000000
woman 2。000000
。。。
woman 113。500000
max man 108。000000
woman 118。000000
dtype: float64
組內離雜湊計數:df。groupby(column)[column2]。value_counts()
資料表中的列按值是否連續,可以分為連續值列、離散值列。對於離散值列,可以統計其不重複值的個數。對於連續值列,統計不重複值一般沒有意義。統計結果是一個Series物件。
group = df。groupby([‘gender’])
df1 = group[‘level’]。value_counts() # 統計‘level’列的不重複值個數
print(type(df1))
print(df1)
gender level
man a 2
woman a 1
b 1
Name: level, dtype: int64
組內數值列和:df。groupby(column)。sum()
每組內,只有數值列能求和,非數值列不可以。
group = df。groupby([‘gender’])
df1 = group。sum()
print(df1)
math chinese
gender
man 230 198
woman 250 218
組內成員數:df。groupby(column)。count()
每組內,按列統計每組的
成員數
。每列的統計結果是一樣的。
group = df。groupby([‘gender’])
df1 =
group。count
()
print(df1)
level math chinese
gender
man 2 2 2
woman 2 2 2
組內數值列均值:df。groupby(column)。mean()
每組內,統計所有數值列的均值,非數值列無均值。
所有組的均值
group = df。groupby([‘gender’])
df1 = group。mean()
print(df1)
math chinese
gender
man 115 99
woman 125 109
單組的均值
group = df。groupby([‘gender’])
df1 = group[‘math’]。mean()
print(df1)
gender
man 115
woman 125
Name: math, dtype: int64
組內數值列中位數:df。groupby(column)。median()
每組內,統計所有數值列的中位數,非數值列無中位數。
統計所有數值列的中位數
group = df。groupby([‘gender’])
df1 = group。median()
print(df1)
math chinese
gender
man 115 99
woman 125 109
統計單個數值列的中位數
group = df。groupby([‘gender’])
df1 = group[‘math’]。median() # 統計‘math’列的中位數
print(df1)
gender
man 115
woman 125
Name: math, dtype: int64
組內數值列最大值:df。groupby(column)。max()
每組內,統計所有數值列的最大值,非數值列無最大值。
統計所有數值列的最大值
group = df。groupby([‘gender’])
df1 = group。max()
print(df1)
level math chinese
gender
man a 120 108
woman b 130 118
統計單個數值列的最大值
group = df。groupby([‘gender’])
df1 = group[‘math’]。max()
print(df1)
gender
man 120
woman 130
Name: math, dtype: int64
組內數值列最小值:df。groupby(column)。min()
每組內,統計所有數值列的最小值,非數值列無最小值。
統計所有數值列的最小值
group = df。groupby([‘gender’])
df1 = group。min()
print(df1)
level math chinese
gender
man a 110 90
woman a 120 100
統計單個數值列的最小值
group = df。groupby([‘gender’])
df1 = group[‘math’]。min()
print(df1)
gender
man 110
woman 120
Name: math, dtype: int64
組內數值列
標準差
:df。groupby(column)。std()
每組內,統計所有數值列的標準差,非數值列無標準差。
統計所有數值列的標準差
group = df。groupby([‘gender’])
df1 = group。std()
print(df1)
math chinese
gender
man 7。071068 12。727922
woman 7。071068 12。727922
統計單個數值列的標準差
group = df。groupby([‘gender’])
df1 = group[‘math’]。std()
print(df1)
gender
man 7。071068
woman 7。071068
Name: math, dtype: float64
組內數值列方差:df。groupby(column)。var()
每組內,統計所有數值列的方差,非數值列無方差。
統計所有數值列的方差
group = df。groupby([‘gender’])
df1 = group。var()
print(df1)
math chinese
gender
man 50 162
woman 50 162
統計單個數值列的方差
group = df。groupby([‘gender’])
df1 = group[‘math’]。var()
print(df1)
gender
man 50
woman 50
Name: math, dtype: int64
組內數值列二分位數:df。groupby(column)。quantile()
每組內,統計所有數值列的二分位數,非數值列無二分位數。
統計單個數值列的二分位數
group = df。groupby([‘gender’])
df1 = group[‘math’]。quantile()
print(df1)
gender
man 115。0
woman 125。0
Name: math, dtype: float64
組內數值列累計和:df。groupby(column)。cumsum()
每組內,統計所有數值列的累計和,非數值列無累計和。
[暫時沒搞懂]
組內應用函式:df。groupby(column1)[column2]。apply()
每組內,可以指定只求某一列的統計指標,包括平均數,方差等。function 可以是mean,或者std等。
group = df。groupby([‘gender’])
df1 = group[‘math’]。apply(np。mean) # 求組內均值
print(df1)
gender
man 115。0
woman 125。0
Name: math, dtype: float64
組內應用多個函式:df。groupby(column)。agg([。。。])
想同時檢視每組內,某數值列的多個統計指標,可以用
agg函式
。它的引數是一個列表,列表中包含各個函式。
group = df。groupby
([‘gender’])
df1 = group[‘math’]。agg([np。mean,np。std]) # 組內應用均值,方差兩個函式
print(df1)
mean std
gender
man 115 7。071068
woman 125 7。071068
組內不同列用不同函式:df。groupby(column)。agg({column1:func, column2:func,。。。})
group = df。groupby([‘gender’])
df1 = group。agg({‘math’:np。mean, ‘chinese’:np。std})
print(df1)
math chinese
gender
man 115 12。727922
woman 125 12。727922
上一篇:100句撩漢小情話