pandas分组与聚合

pandas分组与聚合

分组(groupby):
  • 对数据集进行分组,然后对每组进行统计分析

  • SQL能够对数据进行过滤,分组聚合

  • pandas能利用groupby进行更加复杂的分组运算

  • 分组运算过程

    1. split(拆分):进行分组的根据

    2. apply(应用):每个分组运行的计算规则

    3. combine(合并):把每个分组的计算结果合并起来
      pandas分组与聚合_第1张图片

import pandas as pd
import numpy as np

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)
print(df_obj)

运行结果:
pandas分组与聚合_第2张图片

  • groupby对象:dataframegroupby, seriesgroupby

    # dataframe根据key1进行分组
    print(type(df_obj.groupby('key1')))
    
    # data1列根据key1进行分组
    print(type(df_obj['data1'].groupby(df_obj['key1'])))
    

    运行结果:
    在这里插入图片描述

  • groupby对象没有进行实际运算,只是包含分组的中间数据

  • 对groupby对象进行分组运算/多重分组运算,如mean()

    # 分组运算
    grouped1 = df_obj.groupby('key1')
    print(grouped1.mean())
    print('-------------')
    
    grouped2 = df_obj['data1'].groupby(df_obj['key1'])
    print(grouped2.mean())
    

    运行结果:
    pandas分组与聚合_第3张图片

    • 非数值数据不进行分组运算
  • size()返回每个分组的元素个数

    # size
    print(grouped1.size())
    print('-------------')
    print(grouped2.size())
    

    运行结果:
    pandas分组与聚合_第4张图片

  • 按列名分组

    • obj.groupby( ‘label’ )

      # 按列名分组
      df_obj.groupby('key1')
      

      运行结果:
      在这里插入图片描述

  • 按列名多重分组

    • obj.groupby([ ‘label1’, 'label2 ']) 多层dataframe

      # 按多个列多层分组
      grouped2 = df_obj.groupby(['key1', 'key2'])
      print(grouped2.size())
      

      运行结果:
      pandas分组与聚合_第5张图片

  • 按自定义的key分组

    • obj.groupby(self_def_key)

      # 按自定义key分组,列表
      self_def_key = [1, 1, 2, 2, 2, 1, 1, 1]
      df_obj.groupby(self_def_key).size()
      

      运行结果:
      在这里插入图片描述

    • 自定义的key可为列表或多层列表

  • unstack可将多层索引的结果转换成单层的dataframe

    grouped3 = df_obj.groupby(['key2', 'key1'])
    print(grouped3.mean())
    print('--------------')
    print(grouped3.mean().unstack())
    

    运行结果:
    pandas分组与聚合_第6张图片

  • groupby对象支持迭代操作

    • 每次迭代返回一个元组(group_name, group_data)

    • 可用于分组数据的具体计算

      # 单层分组
      for group_name, group_data in grouped1:
          print(group_name)
          print(group_data)
      

      运行结果:
      pandas分组与聚合_第7张图片

  • groupby对象可以转换成列表或字典

    # GroupBy对象转换list
    list(grouped1)
    

    运行结果:
    pandas分组与聚合_第8张图片

  • pandas也支持按列分组

    df_obj2 = pd.DataFrame(np.random.randint(1, 10, (5,5)),
                           columns=['a', 'b', 'c', 'd', 'e'],
                           index=['A', 'B', 'C', 'D', 'E'])
    
    df_obj2.ix[1, 1:4] = np.NaN
    df_obj2
    

    运行结果:
    pandas分组与聚合_第9张图片

  • 其他分组方法

    • 通过字典分组

      # 通过字典分组
      mapping_dict = {'a':'python', 'b':'python', 'c':'java', 'd':'C', 'e':'java'}
      df_obj2.groupby(mapping_dict, axis=1).sum()
      

      运行结果:
      pandas分组与聚合_第10张图片

    • 通过函数分组,函数传入的参数为列索引或行索引

      # 通过函数分组
      df_obj3 = pd.DataFrame(np.random.randint(1, 10, (5,5)),
                             columns=['a', 'b', 'c', 'd', 'e'],
                             index=['AA', 'BBB', 'CC', 'D', 'EE'])
      #df_obj3
      
      def group_key(idx):
          """
              idx 为列索引或行索引
          """
          #return idx
          return len(idx)
      
      df_obj3.groupby(group_key).size()
      
      # 以上自定义函数等价于
      #df_obj3.groupby(len).size()
      

      运行结果:
      在这里插入图片描述

    • 通过索引级别分组

      # 通过索引级别分组
      columns = pd.MultiIndex.from_arrays([['Python', 'Java', 'Python', 'Java', 'Python'],
                                           ['A', 'A', 'B', 'C', 'B']], names=['language', 'index'])
      df_obj4 = pd.DataFrame(np.random.randint(1, 10, (5, 5)), columns=columns)
      df_obj4
      

      运行结果:
      pandas分组与聚合_第11张图片

聚合(aggregation):
dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randint(1,10, 8),
            'data2': np.random.randint(1,10, 8)}
df_obj5 = pd.DataFrame(dict_obj)
print(df_obj5)

运行结果:
pandas分组与聚合_第12张图片

  • 数组产生标量的过程,如mean(),count()等

  • 常用于对分组后的数据进行计算

  • 内置的聚合函数

    • sum(), mean(), max(), min(), count(), size(), describe()

      # 内置的聚合函数
      print(df_obj5.groupby('key1').sum())
      print('----------------------')
      print(df_obj5.groupby('key1').max())
      print('----------------------')
      print(df_obj5.groupby('key1').min())
      print('----------------------')
      print(df_obj5.groupby('key1').mean())
      print('----------------------')
      print(df_obj5.groupby('key1').size())
      print('----------------------')
      print(df_obj5.groupby('key1').count())
      print('----------------------')
      print(df_obj5.groupby('key1').describe())
      

      运行结果:
      pandas分组与聚合_第13张图片

  • 可自定义函数,传入agg方法中

    • grouped.agg(func)

    • func的参数为groupby索引对应的记录

      # 自定义聚合函数
      def peak_range(df):
          """
              返回数值范围
          """
          #print type(df) #参数为索引所对应的记录
          return df.max() - df.min()
      
      print(df_obj5.groupby('key1').agg(peak_range))
      print('-----------------')
      print(df_obj.groupby('key1').agg(lambda df : df.max() - df.min()))
      

      运行结果:
      pandas分组与聚合_第14张图片

  • 应用多个聚合函数

    • 同时应用多个函数进行聚合操作,使用函数列表

      # 同时应用多个聚合函数
      print(df_obj.groupby('key1').agg(['mean', 'std', 'count', peak_range])) # 默认列名为函数名
      

      运行结果:
      在这里插入图片描述

    • 对不同的列分别作用不同的聚合函数,使用dict

      # 每列作用不同的聚合函数
      dict_mapping = {'data1':'mean',
                      'data2':'sum'}
      print(df_obj.groupby('key1').agg(dict_mapping))
      

      运行结果:
      在这里插入图片描述

常用内置聚合函数:
函数 说明
count 分组中非NA值的数量
sum 非NA值的和
mean 非NA值的平均值
median 非NA值的算术中位数
std、var 无偏标准差和方差
min、max 非NA值的最小值和最大值
prod 非NA值的积
first、last 第一个和最后一个非NA值

你可能感兴趣的:(pandas,python,pandas,数据分析)