根据统计研究的需要,将原始数据按照某种标准划分成不同的组别,分组后的的数据称为分组数据。
# -*- coding: utf-8 -*-
import pandas as pd
data = {
'name': ['NAME0', 'NAME1', 'NAME2', 'NAME3', 'NAME4', 'NAME5', 'NAME6', 'NAME7', 'NAME8', 'NAME9'],
'age': [0, 6, 2, 8, 6, 5, 6, 7, 8, 8],
'weight': [110, 101, 102, 101, 101, 105, 105, 107, 108, 109],
'is_single_dog': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']
}
indexs = ['index0', 'index1', 'index2', 'index3', 'index4', 'index5', 'index6', 'index7', 'index8', 'index9']
df = pd.DataFrame(data, index=indexs)
print(df)
控制台输出结果:
name age weight is_single_dog
index0 NAME0 0 110 yes
index1 NAME1 6 101 yes
index2 NAME2 2 102 no
index3 NAME3 8 101 yes
index4 NAME4 6 101 no
index5 NAME5 5 105 no
index6 NAME6 6 105 no
index7 NAME7 7 107 yes
index8 NAME8 8 108 no
index9 NAME9 8 109 no
# 按年龄分组
df = df.groupby('age')
print(df)
控制台输出结果:
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000021851069FD0>
注意事项:
分组的结果是无法直接输出的,print()只能看到该结果的数据类型。
可以用循环对分组后的结果进行遍历。
可以用循环对分组后的结果进行遍历:
# 按年龄分组
df = df.groupby('is_single_dog')
print(df)
print()
for key, value in df:
print(key)
print(value)
print()
控制台输出结果:
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000024A80A79FD0>
no
name age weight is_single_dog
index2 NAME2 2 102 no
index4 NAME4 6 101 no
index5 NAME5 5 105 no
index6 NAME6 6 105 no
index8 NAME8 8 108 no
index9 NAME9 8 109 no
yes
name age weight is_single_dog
index0 NAME0 0 110 yes
index1 NAME1 6 101 yes
index3 NAME3 8 101 yes
index7 NAME7 7 107 yes
# 按age 和 is_single_dog分组
df = df.groupby(['age', 'is_single_dog'])
print(df)
print()
for key, value in df:
print(key)
print(value)
print()
控制台输出结果:
(0, 'yes')
name age weight is_single_dog
index0 NAME0 0 110 yes
(2, 'no')
name age weight is_single_dog
index2 NAME2 2 102 no
(5, 'no')
name age weight is_single_dog
index5 NAME5 5 105 no
(6, 'no')
name age weight is_single_dog
index4 NAME4 6 101 no
index6 NAME6 6 105 no
(6, 'yes')
name age weight is_single_dog
index1 NAME1 6 101 yes
(7, 'yes')
name age weight is_single_dog
index7 NAME7 7 107 yes
(8, 'no')
name age weight is_single_dog
index8 NAME8 8 108 no
index9 NAME9 8 109 no
(8, 'yes')
name age weight is_single_dog
index3 NAME3 8 101 yes
对数据表中的数值列进行统计,给出包括count = 计数,mean = 平均数,std = 方差,min = 最小值,25% = 四分位数,50% = 二分位数,75% = 四分之三分位数,max = 最大值的信息。不会对非数值列统计。
# 按weight分组
df = df.groupby(['weight'])
df1 = df.describe()
print(df1)
控制台输出结果:
age
count mean std min 25% 50% 75% max
weight
101 3.0 6.666667 1.154701 6.0 6.00 6.0 7.00 8.0
102 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0
105 2.0 5.500000 0.707107 5.0 5.25 5.5 5.75 6.0
107 1.0 7.000000 NaN 7.0 7.00 7.0 7.00 7.0
108 1.0 8.000000 NaN 8.0 8.00 8.0 8.00 8.0
109 1.0 8.000000 NaN 8.0 8.00 8.0 8.00 8.0
110 1.0 0.000000 NaN 0.0 0.00 0.0 0.00 0.0
# 按weight分组,查看age列的统计信息
df = df.groupby(['weight'])['age']
df1 = df.describe()
控制台输出结果:
count mean std min 25% 50% 75% max
weight
101 3.0 6.666667 1.154701 6.0 6.00 6.0 7.00 8.0
102 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0
105 2.0 5.500000 0.707107 5.0 5.25 5.5 5.75 6.0
107 1.0 7.000000 NaN 7.0 7.00 7.0 7.00 7.0
108 1.0 8.000000 NaN 8.0 8.00 8.0 8.00 8.0
109 1.0 8.000000 NaN 8.0 8.00 8.0 8.00 8.0
110 1.0 0.000000 NaN 0.0 0.00 0.0 0.00 0.0
unstack()可以将每列的统计信息垂直排列。
# 按weight分组,查看age列的统计信息
df = df.groupby(['weight'])['age']
df1 = df.describe().unstack()
print(df1)
控制台输出结果:
weight
count 101 3.000000
102 1.000000
105 2.000000
107 1.000000
108 1.000000
109 1.000000
110 1.000000
mean 101 6.666667
102 2.000000
105 5.500000
107 7.000000
108 8.000000
109 8.000000
110 0.000000
std 101 1.154701
102 NaN
105 0.707107
107 NaN
108 NaN
109 NaN
110 NaN
min 101 6.000000
102 2.000000
105 5.000000
107 7.000000
108 8.000000
109 8.000000
110 0.000000
25% 101 6.000000
102 2.000000
105 5.250000
107 7.000000
108 8.000000
109 8.000000
110 0.000000
50% 101 6.000000
102 2.000000
105 5.500000
107 7.000000
108 8.000000
109 8.000000
110 0.000000
75% 101 7.000000
102 2.000000
105 5.750000
107 7.000000
108 8.000000
109 8.000000
110 0.000000
max 101 8.000000
102 2.000000
105 6.000000
107 7.000000
108 8.000000
109 8.000000
110 0.000000
dtype: float64
数据表中的列按值是否连续,可以分为连续值列、离散值列。对于离散值列,可以统计其不重复值的个数。对于连续值列,统计不重复值一般没有意义。统计结果是一个Series对象。
# 按weight分组,求和
df = df.groupby(['weight']).sum()
print(df)
控制台输出结果:
age
weight
101 20
102 2
105 11
107 7
108 8
109 8
110 0
每组内,按列统计每组的成员数。每列的统计结果是一样的
# 按weight分组,按列统计每组的成员数
df = df.groupby(['weight']).count()
print(df)
控制台输出结果:
name age is_single_dog
weight
101 3 3 3
102 1 1 1
105 2 2 2
107 1 1 1
108 1 1 1
109 1 1 1
110 1 1 1
每组内,统计所有数值列的均值,非数值列无均值。
# 按weight分组,统计所有数值列的均值
df = df.groupby(['weight']).mean()
print(df)
控制台输出结果:
age
weight
101 6.666667
102 2.000000
105 5.500000
107 7.000000
108 8.000000
109 8.000000
110 0.000000
# 按is_single_dog分组,统计weight列的均值
df = df.groupby(['is_single_dog'])['weight'].mean()
print(df)
控制台输出结果:
is_single_dog
no 105.00
yes 104.75
Name: weight, dtype: float64
每组内,统计所有数值列的最大值
# 按is_single_dog分组,统计所有列最大值
df = df.groupby(['is_single_dog']).max()
print(df)
控制台输出结果:
name age weight
is_single_dog
no NAME9 8 109
yes NAME7 8 110
# 按is_single_dog分组,统计weight列最大值
df = df.groupby(['is_single_dog'])['weight'].max()
print(df)
控制台输出结果:
is_single_dog
no 109
yes 110
Name: weight, dtype: int64
# 按is_single_dog分组,统计weight列平均值
df = df.groupby(['is_single_dog'])['weight'].apply(np.mean)
print(df)
控制台输出结果:
is_single_dog
no 105.00
yes 104.75
Name: weight, dtype: float64
# 按is_single_dog分组,统计weight列平均值,age的标准差
df = df.groupby(['is_single_dog'])
df1 = df.agg({
'weight': np.mean,
'age': np.std
})
控制台输出结果:
weight age
is_single_dog
no 105.00 2.228602
yes 104.75 3.593976