Python pandas库 ->groupby分组操作

首先 在SQL中 分组操作group by是对行记录的拆分

在pandas中 分组操作groupby可以选择对行或者列进行拆分

pandas分组之后可以根据每组的组名value(非列名)访问部分数据 因为分组后默认以组名作为索引 groupby默认参数as_index=True

如果设置as_index=False 分组后所有的列名不变 

类似于SQL中 group by之后的having 分组列名=value

最后都是用聚合方法 合并计算数据

 1 import numpy as np
 2 import pandas as pd
 3 from pandas import DataFrame,Series
 4 df1=DataFrame({'symbol':['001','001','002','002','003'],
 5 'tdate':['201901','201902','201901','201902','201901'],
 6 'open':np.random.randint(0,50,5),
 7 'close':np.random.randint(50,100,5)})
 8 
 9 print(df1)
10 
11 grp1=df1.groupby('symbol')
12 grp2=df1.groupby(['symbol','tdate'])
13 
14 print('#可用循环语句访问组名和每组的内容')
15 for name,group in grp1:
16     print(name)
17     print(group)
18 
19 print('#通过组名访问数据')
20 print(grp1.get_group('001'))
21 print(grp2.get_group(('001','201901')))
22     
23 print('#计算指定列的均值 三种等价写法')
24 print(grp1.open.mean())
25 print(grp1.open.agg('mean')) #这里函数mean要加引号 如果是自定义函数不需要
26 print(grp1.agg({'open':'mean'})) #这里指定了列名 返回DataFrame而非Series
27 
28 print('#计算指定列的指定聚合方法')
29 def my_func(x):
30     return max(x)-min(x)
31 print(grp1.open.agg(my_func))
32 print(grp1.open.agg(lambda x:max(x)-min(x))) #用匿名函数
33 
34 print('#对指定列进行计算处理')
35 print(grp1.open.apply(lambda x:x+100))

结果如下图

 

同时 pandas可以直接对列进行拆分 设置groupby 参数axis=1即可

这个在SQL中是难以做到的

 1 import numpy as np
 2 import pandas as pd
 3 from pandas import DataFrame,Series
 4 df1=DataFrame({'symbol':['001','001','002','002','003'],
 5 'tdate':['201901','201902','201901','201902','201901'],
 6 'open':np.random.randint(0,50,5),
 7 'close':np.random.randint(50,100,5)})
 8 
 9 print(df1)
10 
11 print('#'*20)
12 
13 grp3=df1.groupby(df1.dtypes,axis=1)
14 grp4=df1.groupby({'symbol':'a','tdate':'a','open':'b','close':'b'},axis=1)
15 
16 for name,group in grp3:
17     print(name)
18     print(group)
19     
20 print('#'*20)
21 
22 for name,group in grp4:
23     print(name)
24     print(group)
25     if name=='b':
26         print('#根据组名访问')
27         print(grp4.get_group(name))
28         print('#聚合操作')
29         print(grp4.get_group(name).mean()) 

结果如下图

 谢谢!

posted @ 2019-05-11 12:29  布里塔  阅读(12507)  评论(0编辑  收藏  举报