\"\"\"pandas提供了一个灵活高效的groupby功能,它使你能一种自然地方式对数据集进行切片,切换,摘要等操作。
根据一个或者多个键(可以是函数可以是数组或者Data 列名)拆分pandas对象。计算分组摘要统计,
如计数、平均数、标准差、或者用户自定义的函数
1:首先看看下面这个非常简单的表格性数据集
\"\"\"
import pandas as pd
import numpy as np
import random
random.seed()
df = pd.Data ({\'key1\':[\'a\', \'a\', \'b\', \'b\', \'a\'],
\'key2\':[\'one\', \'two\', \'one\', \'two\', \'one\'],
\'data1\':np.random.randn(5),
\'data2\':np.random.randn(5)})
print(df)
#假设你想要按key1进行分组,并计算data1列的平均值,你可以先访问data1,并且根据key1调用groupby:
grouped=df[\'data1\'].groupby(df[\'key1\']) #根据一个条件进行分组
\"\"\"
注意groupby是一个Groupby对象,他实际上还没有进行任何计算,
只是含有一些有关分组键df[\'key1\']的中间数据而已,然后我们可以掉用GroupBy的mean()方法来计算分组的平均值。
\"\"\"
print(grouped)
print(grouped.mean())
\"\"\"
注意:数据Series根据分组键进行聚合,产生一个新的Series,其索引为key1列中的唯一值,之所以
结果中的索引值的名称为key1,是因为原始的Data 的列df[\'key1\']就叫这个名字。
\"\"\"
print(type(grouped.mean()))
\"\"\"\"
2:如果我们一次传入多个分组,就会得到不同的结果。
通过两个键对数据进行了分组,得到的Series具有一个层次化索引
\"\"\"
means=df[\'data1\'].groupby([df[\'key1\'],df[\'key2\']])
print(means.mean())
#以上这些事例二中,分组键均为Series.实际上,分组键可以是任何长度适当的数组。
print(\"*\"*50)
#*************************************************************************************************
states = np.array([\'Ohio\', \'California\', \'California\', \'Ohio\', \'Ohio\'])
years = np.array([2005, 2005, 2006, 2005, 2006])
grouped2=df[\'data1\'].groupby([states,years]).mean()
print(grouped2)
print(\"*\"*50)
#************************************************************************************
\"\"\"\"
3:此外还可以将列名用作分组
\"\"\"
grouped3=df.groupby(\'key1\')
print(grouped3.mean())
#用列名进行多个条件进行分组
grouped4=df.groupby([\'key1\',\'key2\'])
print(grouped4.mean())
\"\"\"\"
说明:在执行df.groupby(\'key1\').mean()时:结果中没有key2列。这是因为df[\'key2]不是数值数据,所以被从结果中
排除了出来,默认情况下,虽有数值列都会被聚合,虽然有时候会过滤为一个子集。
\"\"\"
#无论你准备拿groupby做什么,都有可能用到groupby中的size方法,他可以返回一个含有分组大下的Series
size=df.groupby([\'key1\',\'key2\']).size()
print(size)
\"\"\"
注意分组中的任何缺失值都会被排除在结果中外的。
\"\"\"
\"\"\"\"
4:对分组进行迭代
注意:GroupBy对象支持迭代,可以产生一组二元数组(有分组名和数据块组成)。看看下面的这个简单的数据集:
\"\"\"
for name,group in df.groupby(\'key1\'):
print(name)
print(group)
#对于多键的情况,元组的第一元素将会是由键值组成的元组:
for (k1,k2),group in df.groupby([\'key1\',\'key2\']):
print(k1,k2)
print(group)
\"\"\"\"
5:选取一个或者一组列
\"\"\"
da1=df.groupby(\'key1\')[\'data1\']
da2=df.groupby(\'key1\')[\'data2\']
#以上的代码等价为:
da1=df[\'data1\'].groupby(df[\'key1\'])
da2=df[\'data2\'].groupby(df[\'key1\'])
\"\"\"
尤其对于大数据集,很可能值需要对部分列进行聚合。例如:在前面的数据集,
如果只需计算data2的平均值并且以Data 形式得到结果
\"\"\"
group2=df.groupby([\'key1\',\'key2\'])[\'data2\'].mean()
print(group2)
group3=df.groupby([\'key1\',\'key2\'])[[\'data2\']].mean()
print(group3)
\"\"\"
注意:以上的这两种操作所返回的对象是一个已分组的Data (如果传入的是列表或数组)
或已分组的Series(如果传入的是标量形式的单个列名)
\"\"\" 继续阅读与本文标签相同的文章
上一篇 :
对话管理的一些思考
-
从事iOS开发4年,我干倒三家公司,4年开发笔记(总结)送给正在迷茫的你!
2026-05-18栏目: 教程
-
【面小易-面经12】阿里巴巴Java方向面试题汇总(含答案)
2026-05-18栏目: 教程
-
前端进阶|第五天 const,let,var作用域问题
2026-05-18栏目: 教程
-
前端进阶|第六天 sort()问题
2026-05-18栏目: 教程
-
汇编(七)[bx]、 loop指令、debug与masm
2026-05-18栏目: 教程
