zoukankan      html  css  js  c++  java
  • 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()) 

    结果如下图

     谢谢!

  • 相关阅读:
    anaconda3 notebook for python数据分析-环境搭建
    MySQL之day4
    MySQL之day3
    MySQL之day2
    综合大实验(按需求完成)
    策略路由实验ACL配置
    双点双向重分布实验
    OSPF实验isis协议的设置命令
    OSPFS实验流量优化
    OSPF实验大串连
  • 原文地址:https://www.cnblogs.com/chendongblog/p/10848270.html
Copyright © 2011-2022 走看看