精华内容
下载资源
问答
  • Python中的groupby用法

    万次阅读 2019-05-06 11:33:54
  • 主要介绍了Python中的groupby分组功能的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
  • Python中的groupby分组

    万次阅读 多人点赞 2018-06-05 21:02:03
    写在前面:之前我对于groupby一直都小看了,而且感觉理解得不彻底,虽然在另外一篇文章也提到groupby的用法,但是这篇文章想着重地分析一下,并能从自己角度分析一下groupby这个好东西~ OUTLINE 根据表...

    写在前面:之前我对于groupby一直都小看了,而且感觉理解得不彻底,虽然在另外一篇文章中也提到groupby的用法,但是这篇文章想着重地分析一下,并能从自己的角度分析一下groupby这个好东西~

    OUTLINE

    • 根据表本身的某一列或多列内容进行分组聚合
    • 通过字典或者Series进行分组

    根据表本身的某一列或多列内容进行分组聚合

    这个是groupby的最常见操作,根据某一列的内容分为不同的维度进行拆解,将同一维度的再进行聚合

    • 按一列进行聚合
    import pandas as pd
    import numpy as np
    df = pd.DataFrame({'key1':list('aabba'),
                      'key2': ['one','two','one','two','one'],
                      'data1': np.random.randn(5),
                      'data2': np.random.randn(5)})

    for i in df.groupby('key1'):
        print(i)
    # 输出:
    ('a',       data1     data2 key1 key2
    0 -0.293828  0.571930    a  one
    1  1.872765  1.085445    a  two
    4 -1.943001  0.106842    a  one)
    ('b',       data1     data2 key1 key2
    2 -0.466504  1.262140    b  one
    3 -1.125619 -0.836119    b  two)
    • 按多列进行聚合,则看的是多列之间维度的笛卡尔积

    比如按照key1列,可以分为a和b两个维度,按照key2列可以分为one和two两个维度,最后groupby这两列之后的结果就是四个group。

    for i in df.groupby(['key1','key2']):
        print(i)
    # 输出:
    (('a', 'one'),       data1     data2 key1 key2
    0 -0.293828  0.571930    a  one
    4 -1.943001  0.106842    a  one)
    (('a', 'two'),       data1     data2 key1 key2
    1  1.872765  1.085445    a  two)
    (('b', 'one'),       data1    data2 key1 key2
    2 -0.466504  1.26214    b  one)
    (('b', 'two'),       data1     data2 key1 key2
    3 -1.125619 -0.836119    b  two)

    通过字典或者Series进行分组

    问题情境:一共有5个同学分别对5样东西做了一个评价,0-5表示对该物品的喜爱程度,随着数值的升高,程度也在不断加深。

    import pandas as pd
    import numpy as np
    import random
    people=pd.DataFrame(
      np.random.randint(low=0,high=6,size=(5,5)),
      columns=['香蕉','苹果','橘子','眼影','眼线'],
      index=['Joe','Steve','Wes','Jim','Travis']
    )

    但是可以明显发现这五样物品可以分为两类:“水果”和“化妆品”。

    问题:我想知道这五名同学对水果和化妆品的平均喜爱程度是什么样的?

    solution1:通过字典分组

    mapping = {'香蕉':'水果','苹果':'水果','橘子':'水果','眼影':'化妆品','眼线':'化妆品'}
    data = people.groupby(mapping,axis=1).mean()

    solution2:通过Series分组

    mapping2 = pd.Series(mapping)
    # mapping2
    橘子     水果
    眼影    化妆品
    眼线    化妆品
    苹果     水果
    香蕉     水果
    dtype: object

    之后将Series传入

    data2 = people.groupby(mapping2,axis=1).mean()

    无论solution1还是2,本质上,都是找index(Series)或者key(字典)与数据表本身的行或者列之间的对应关系,在groupby之后所使用的聚合函数都是对每个group的操作,聚合函数操作完之后,再将其合并到一个DataFrame中,每一个group最后都变成了一列(或者一行)。

    另外一个我容易忽略的点就是,在groupby之后,可以接很多很有意思的函数,apply/transform/其他统计函数等等,都要用起来!


    彩蛋~

    意外发现这两种不同的语法格式在jupyter notebook上结果是一样的,但是形式有些微区别

    df.groupby(['key1','key2'])[['data2']].mean()

    df.groupby(['key1','key2'])['data2'].mean()

    展开全文
  • python中的groupby详解

    2020-04-10 17:44:04
    from operator import ...from itertools import groupby #itertool还包含有其他很多函数,比如将多个list联合起来。。 d1={‘name’:‘zhangsan’,‘age’:20,‘country’:‘China’} 这里是引用 d2={‘n...

    Python学习笔记:itertools 中的groupby的用法详解

    利用代码的结果展示更为清晰

    from operator import itemgetter 
    from itertools import groupby 
    
    s1={'name':'wtc','school':'QH','age':21}
    s2={'name':'hpl','school':'ND','age':22}
    s3={'name':'bfd','school':'ND','age':19}
    s4={'name':'hzl','school':'MIT','age':25}
    s5={'name':'gmc','school':'MIT','age':22}
    s6={'name':'jeamsbandon','school':'MIT','age':24}
    
    lst=[s1,s2,s3,s4,s5,s6]
    
    #通过school进行分组
    
    lst.sort(key=itemgetter('school'))
    ls = groupby(lst,itemgetter('school')) 
    
    
    for value,groups in ls:
        for group in groups: 
            print (value,group)
    

    程序运行后的结果:
    在这里插入图片描述

    Groupby使用之前先进行排序,如果不排序无法进行分组,或者说分组可能达不到预期。sort()是永久性排序,会改变原列表顺序;sorted()是临时排序,不会改变原列表顺序。lst=[s1,s2,s3,s4,s5,s6] 把这六个字典存在列表中,使用sort排序对列表操作。lst.sort(key=itemgetter(‘school’))的意思是按字典中键值对中的键school对应的值来进行排序。等待排序完成后执行ls = groupby(lst,itemgetter(‘school’)) 这时的操作是把排好序的列表lst再进行分组,还是按照 键school对应的值来进行分组。所以就会分成[{‘name’:‘hpl’,‘school’:‘ND’,‘age’:22},{‘name’:‘bfd’,‘school’:‘ND’,‘age’:19}]这两个一组,然后[{‘name’:‘wtc’,‘school’:‘QH’,‘age’:21} ]自己一组。 [{‘name’:‘hzl’,‘school’:‘MIT’,‘age’:25},{‘name’:‘gmc’,‘school’:‘MIT’,‘age’:22},{‘name’:‘jeamsbandon’,‘school’:‘MIT’,‘age’:24}]三个一组,然后for value,groups in ls: for group in groups: print value,group 中value取的是键school对应的值,而groups取的是一个组,也就是上面三个组,所以group取的是组内的一整个字典。

    下面是对数值进行操作:

    from itertools import groupby
    lst=[45, 70, 55, 66, 87, 98, 100, 88, 96, 68]
    
    def sorts(valuess):
        if valuess < 60:
            return 'not pass'
        elif valuess >= 90:
            return 'excellence'
        else:
            return 'OK'
    
    print ([(value,list(group)) for value,group in groupby(sorted(lstt),key=sorts)])
    
    

    程序运行后的结果:
    在这里插入图片描述
    [(k,list(g))for k,g in groupby(sorted(lst),key=gb)] sorted(lst)对于列表lst中的数值进行临时排序,排序时的关键字是按照从函数gb中返回来的结果。groupby(sorted(lst),key=gb) 然后进行分组,因为排序是从小到大的顺序进行排列的,所以整个分组的结果就是[(‘less’, [2, 6, 8, 9]), (‘middle’, [11, 25, 29]), (‘great’, [43, 51, 66])]
    ,而变成列表方式输出是因为(k,list(g))首先把g取回来的组变成了列表形式,最后输出的时使用列表框括起来的。

    展开全文
  • python中的groupby方法详解

    千次阅读 2018-12-31 11:11:14
    前言 Python的pandas包提供的数据聚合与分组运算功能很强大,也很灵活。《Python for Data Analysis》这本书第9章详细的介绍了这方面的用法,但是有些细节不常用就容易忘记,...根据书中的章节,这部分知识包括以...

    原文地址:http://www.cnblogs.com/zhangzhangwhu/p/7219651.html

    前言

    Python的pandas包提供的数据聚合与分组运算功能很强大,也很灵活。《Python for Data Analysis》这本书第9章详细的介绍了这方面的用法,但是有些细节不常用就容易忘记,遂打算把书中这部分内容总结在博客里,以便复习查看。根据书中的章节,这部分知识包括以下四部分:

    1.GroupBy Mechanics(groupby技术)

    2.Data Aggregation(数据聚合)

    3.Group-wise Operation and Transformation(分组级运算和转换)

    4.Pivot Tables and Cross-Tabulation(透视表和交叉表)

    本文是第一部分,介绍groupby技术。

     

    一、分组原理

    核心:

    1.不论分组键是数组、列表、字典、Series、函数,只要其与待分组变量的轴长度一致都可以传入groupby进行分组。

    2.默认axis=0按行分组,可指定axis=1对列分组。

     

    对数据进行分组操作的过程可以概括为:split-apply-combine三步:

    1.按照键值(key)或者分组变量将数据分组。

    2.对于每组应用我们的函数,这一步非常灵活,可以是python自带函数,可以是我们自己编写的函数。

    3.将函数计算后的结果聚合。

    figure1

    图1:分组聚合原理(图片来自《Python for Data Analysis》page 252)

    复制代码

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],
        'key2' : ['one', 'two', 'one', 'two', 'one'],
        'data1' : np.random.randn(5),
        'data2' : np.random.randn(5)})

    复制代码

    figure2

    我们将key1当做我们的分组键值,对data1进行分组,再求每组的均值:

    grouped = df['data1'].groupby(df['key1'])

    语法很简单,但是这里需要注意grouped的数据类型,它不在是一个数据框,而是一个GroupBy对象。

    grouped

    figure3

    实际上,在这一步,我们并没有进行任何计算仅仅是创建用key1分组后创建了一个GroupBy对象,我们后面函数的任何操作都是基于这个对象的。

    求均值:

    grouped.mean()

    figure4

    刚刚我们只是用了key1进行了分组,我们也可以使用两个分组变量,并且通过unstack方法进行结果重塑:

    means = df['data1'].groupby([df['key1'], df['key2']]).mean()
    means

    figure5

    means.unstack

    figure6

    以上我们的分组变量都是df内部的Series,实际上只要是和key1等长的数组也可以:

    states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])
    years = np.array([2005, 2005, 2006, 2005, 2006])
    df['data1'].groupby([states, years]).mean()

    figure6

    二、对分组进行迭代

    GroupBy对象支持迭代操作,会产生一个由分组变量名和数据块组成的二元元组:

    for name, group in df.groupby('key1'):
        print name
        print group

    figure7

    如果分组变量有两个:

    for (k1,k2), group in df.groupby(['key1','key2']):
        print k1,k2
        print group

    figure8

    我们可以将上面的结果转化为list或者dict,来看看结果是什么样的:

    list(df.groupby(['key1','key2']))

    figure9

    看不太清楚,我们来看看这个列表的第一个元素:

    list(df.groupby(['key1','key2']))[0]

    figure10

    同样,我们也可以将结果转化为dict(字典):

    dict(list(df.groupby(['key1','key2'])))

    figure11

    dict(list(df.groupby(['key1','key2'])))[('a','one')]

    figure12

    以上都是基于行进行分组,因为默认情况下groupby是在axis=0方向(行方向)进行分组,我们可以指定axis=1方向(列方向)进行分组:

    grouped=df.groupby(df.dtypes,axis=1)
    list(grouped)[0]

    figure13

    dict(list(grouped))

    figure14

    注意,

    '''下面两段语句功能一样'''
    df.groupby('key1')['data1']
    df.data1.groupby(df.key1)

    三、通过字典进行分组

    people = pd.DataFrame(np.random.randn(5, 5),
         columns=['a', 'b', 'c', 'd', 'e'],
         index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
    people.ix[2:3, ['b', 'c']] = np.nan # 添加缺失值
    people

    figure15

    假如,我们想按列进行聚合,该怎么操作呢?

    我们根据实际情况,对列名建立字典,然后将此字典传入groupby,切记指定axis=1,因为我们是对列进行分组聚合:

    mapping = {'a': 'red', 'b': 'red', 'c': 'blue',
         'd': 'blue', 'e': 'red', 'f' : 'orange'}
    by_columns=people.groupby(mapping,axis=1)
    by_columns.mean()

    figure16

    既然我们可以通过传入字典来对列进行分组,那么肯定也可以通过传入Series来对列进行分组了(Series中的index就相当字典中的key嘛):

    map_series = pd.Series(mapping)
    people.groupby(map_series,axis=1).count()

    figure17

    四、通过函数进行分组

    刚刚我们分组时利用了dict和series建立映射,对于一些复杂的需求,我们可以直接对groupby函数传递函数名来进行分组,以刚才的people数据为例,如果我们想按行分组,分组的key是每个人名的字母长度,该怎么做呢?比较直接的想法是相对每个名字求长度,建立一个数组,然后将这个数组传入groupby,我们来试验一下:

    l=[len(x) for x in people.index]
    people.groupby(l).count()

    figure18

    方案可行,那么有没有更快捷更优美的方法呢?当然有啦,我们只需将len这个函数名传给groupby即可:

    people.groupby(len).count()

    figure18

    除了传递函数,我们也可以将函数和dict,series,array一起使用,毕竟最后都会统统转化为数组:

    key_list = ['one', 'one', 'one', 'two', 'two']
    people.groupby([len, key_list]).min()

    figure19

    五、根据索引级别分组

    刚刚我们的数据索引只有一级,当数据有多级索引时,可以通过level指定我们想要分组的索引,注意要使用axis=1表示按列:

    columns = pd.MultiIndex.from_arrays([['Asian', 'Asian', 'Asian', 'America', 'America'],
        ['China','Japan','Singapore','United States','Canada']], names=['continent', 'country'])
    hier_df = pd.DataFrame(np.random.randn(4, 5), columns=columns)
    hier_df

    figure19

    我们按洲进行分组求和:

    figure20

    展开全文
  • 直接上测试数据,其他代码,大家还是要自己敲,才能真正对打击提升理解力有帮助 import pandas as pd test_dict = {'id':['A','A','A','A','B','B'], 'name':['a','b','b','a','c','c'], 'math':[90,89,99,78,...
  • python中的groupby()函数

    2019-08-26 19:45:32
    groupby() 函数扫描整个序列并且查找连续相同值(或者根据指定key函数返回值相同)元素序列。 在每次迭代时候,它会返回一个值和一个迭代器对象, 这个迭代器对象可以生成元素值全部等于上面那个值所有对象...
  • pandas中的DataFrame中可以根据某个属性的同一值进行聚合分组,可以选单个属性,也可以选多个属性:代码示例:import pandas as pdA=pd.DataFrame([['Beijing',1.68,2300,'city','Yes'],['Tianjin',1.13,1293,'city'...
  • python中series的groupby

    2020-09-01 20:25:23
    今天在学习时,看到一个数据类型叫“SeriesGroupBy”,并且看到这样一个示例: ...第一次见到一维数组的分组,而且groupby后的参数还是一个列表,列表中还是4个值,这些列表中的数值都有什么作用?百度了一下没有查
  • python中groupby函数详解

    2020-10-28 10:41:02
    python中groupby函数主要作用是进行数据分组以及分组后地组内运算! 对于数据分组和分组运算主要是指groupby函数应用,具体函数规则如下: df[](指输出数据结果属性名称).groupby([df[属性],df[属性])...
  • python中Groupby的使用

    2020-01-15 11:12:08
    #coding=utf-8 """ @author=wanggang Create at Jan,15,2020 """ import pandas as pd import matplotlib.pyplot as plt import numpy as np wt=pd.read_excel('HUN.xlsx'...pt=wt['confidence'].groupby(wt['title'...
  • python3中的groupby函数用法

    万次阅读 多人点赞 2017-10-25 10:29:43
    ...Python的pandas包提供的数据聚合与分组运算功能很强大,也很灵活。《Python for Data Analysis》这本书第9章详细的介绍了这方面的用法,但是有些细节不常用就容易忘记,遂打算把书中这部分内容...根据书中的
  • python中groupby函数主要作用是进行数据分组以及分组后地组内运算! 对于数据分组和分组运算主要是指groupby函数应用,具体函数规则如下: df[](指输出数据结果属性名称).groupby([df[属性],df[属性])...
  • 主要介绍了Python中的分组函数groupby和itertools)的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
  • Python中groupby索引处理

    千次阅读 2020-04-01 17:10:29
    1、利用groupby中的as_index参数 data.groupby('city',as_index=False)['是否中标'].count() 2、groupby结果利用reset_index将行索引转换为列 gr=data.groupby('city')['是否中标'].count() gr.reset_index(dro...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 652
精华内容 260
关键字:

python中的groupby

python 订阅