df.groupby()方法讲解
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 chinese0 a man 120 902 a man 110 108woman level gender math chinese1 b woman 130 1003 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 chinese0 a man 120 902 a man 110 108woman level gender math chinese1 b woman 130 1003 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 chinese0 a man 120 902 a man 110 108('woman', 'a') level gender math chinese3 a woman 120 118('woman', 'b') level gender math chinese1 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)<class 'pandas.core.frame.DataFrame'> 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% maxgender man 2.0 115.0 7.071068 110.0 112.5 115.0 117.5 120.0woman 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)gendermath count man 2.000000 woman 2.000000 ... max man 120.000000 woman 130.000000chinese count man 2.000000 woman 2.000000 ... woman 113.500000 max man 108.000000 woman 118.000000dtype: float64
组内离散列计数:df.groupby(column)[column2].value_counts()
数据表中的列按值是否连续,可以分为连续值列、离散值列。对于离散值列,可以统计其不重复值的个数。对于连续值列,统计不重复值一般没有意义。统计结果是一个Series对象。
group = df.groupby(['gender'])df1 = group['level'].value_counts() # 统计'level'列的不重复值个数print(type(df1))print(df1)<class 'pandas.core.series.Series'>gender levelman a 2woman a 1 b 1pyName: level, dtype: int64
组内数值列和:df.groupby(column).sum()
group = df.groupby(['gender'])df1 = group.sum()print(df1)math chinesegender man 230 198woman 250 218
组内成员数:df.groupby(column).count()
每组内,按列统计每组的成员数。每列的统计结果是一样的
group = df.groupby(['gender'])df1 = group.count()print(df1)level math chinesegender man 2 2 2woman 2 2 2
组内数值列均值:df.groupby(column).mean()
每组内,统计所有数值列的均值,非数值列无均值。
所有组的均值
group = df.groupby(['gender'])df1 = group.mean()print(df1)math chinesegender man 115 99woman 125 109
单组的均值
group = df.groupby(['gender'])df1 = group['math'].mean()print(df1)genderman 115woman 125Name: math, dtype: int64
组内数值列最大值:df.groupby(column).max()
每组内,统计所有数值列的最大值,非数值列无最大值
统计所有数值列的最大值
group = df.groupby(['gender'])df1 = group.max()print(df1)level math chinesegender man a 120 108woman b 130 118
统计单个数值列的最大值
group = df.groupby(['gender'])df1 = group['math'].max()print(df1)genderman 120woman 130Name: math, dtype: int64
组内应用函数:df.groupby(column1)[column2].apply()
group = df.groupby(['gender'])df1 = group['math'].apply(np.mean) # 求组内均值print(df1)genderman 115.0woman 125.0Name: math, dtype: float64
组内不同列用不同函数:df.groupby(column).agg({column1:func, column2:func,…})
group = df.groupby(['gender'])df1 = group.agg({'math':np.mean, 'chinese':np.std})print(df1)math chinesegender man 115 12.727922woman 125 12.727922
来源地址:https://blog.csdn.net/HTDiiii/article/details/127000069
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341