python学习了快3个月,因为各种各样的私人事情和工作,断断续续,跟着课程抄抄代码,其实真正记住的并不多,直到最近开始尝试独立思考完成项目,才发现之前很多学过的内容只知其形不知其意,所以很有必要重新回忆一下基本操作,夯实基础,才能避免重复踩坑。
首先想要攻破的是groupby,一直觉得python的分组不如Excel的透视表灵活好用,其实是对这个分组功能没有熟练掌握的缘故,因此,趁着这个机会,重新复习一下数据分组的内容。
分组统计-groupby,可以实现:
1)根据某些条件将数据拆分成组
2)对每组独立应用函数
3)将结果合并到一个数据结构中
df.groupby(by=None,
axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False,
**kwargs)
常用的两个参数:
by 是用来按照分组的对象,有多重形式,后面具体展开
默认是axis = 0,以行来分组,axis = 1,以列来分组
1、按照单个或多个列进行分组
举例:
data = pd.DataFrame({'A':['three','one','three','two','one','two'],
'B':['apple','orange','orange','apple','lemon','apple'],
'C':np.random.randint(0,9,6)})
运行得到data的样子:
a = data.groupby('A').sum()
b = data.groupby(['A','B']).sum()
运行结果:
对于C列的值可以按照A列进行统计,也可以按照A,B两列进行统计,通过分组后的计算,得到一个新的dataframe
2.其他轴上的分组
a1 = data.groupby(data.dtypes,axis =1)
for n,p in a1:
print(n)
print(p)
print('\n')
运行后:
这个语句是按照data里不同格式进行分组,包括整数和字符对象,使用了axis = 1 将会按照列进行分组。
3.通过函数进行分组
举例
data2 = pd.DataFrame(np.arange(16).reshape(4,4),
columns = ['A','B','C','D'],
index = ['abc','ab','bcd','c'])
运行得到data2的样子:
按照index的字符长度进行加和
c = data2.groupby(len).sum()
运行结果:
4.通过多函数计算进行分组,agg方法,可以通过list或者dic传入
举例:
data3 = pd.DataFrame({'A':[1,1,2,2],
'B':np.random.randint(0,8,4),
'C':np.random.randint(0,6,4),
'D':[1,2,1,2]})
运行得到data3:
按照A分组,求和跟计数分别统计
d = data3.groupby('A').agg(['sum','count'])
运行结果:
还可以对分组后的值进行函数计算
e = data3.groupby('A')['B'].agg({'result1':np.sum,
'result2':np.mean})
运行结果:
5.还可以结合apply进行函数运算,apply 是一个更一般化的方法:将一个数据分拆-应用-汇总
举例:
data4 = pd.DataFrame({'A':list('aabab'),
'B':np.random.randint(0,8,5),
'C':np.random.randint(0,8,5),
'D':['one','two','one','two','one']})
运行得到data4的样子:
定义一个函数提取数据的前2行:
def first_n(data,n):
return data[0:n]
我们先使用一下agg方法:
f = data4.groupby('A').agg(first_n,2)
运行后出现错误:
不能将长度为4的序列复制到维度是2的数组中
再使用apply方法进行尝试:
g = data4.groupby('A').apply(first_n,2)
运行结果:
运行成功了,这段语句的意思是,先按照’A’列进行分组,然后提取分组后数据的前两行。
最后总结下groupby的作用:
1、 分组:可以按照某个列、多个列或者某个函数进行分组
2、 聚合计算:可以使用内置函数,例如:max,min.sum.count等等
可以使用agg方法自定义函数,支持多个函数
可以使用apply方法,自定义更丰富和复杂的分组聚合规则
结合了这么多的功能去看,python的分组聚合灵活度远远高于excel,以后我会更加热爱使用python的。(本文章灵感来自数据分析师(python)微专业)