您當前的位置:首頁 > 書法

Pandas-分組:df.groupby()

作者:由 zero 發表于 書法時間:2020-06-18

分組

根據研究目的,將所有樣本點按照一個或多個屬性劃分為多個組,就是分組。

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

標簽: GROUP  groupby  df  df1  math