Py学习  »  Python

python数据分析8:数据分组统计

浮云的痛 • 3 年前 • 303 次点击  

1.根据给定的条件将数据拆分成组

2.每个组都可以独立应用函数(如求和,求平均值)

3.将结果合并到一个数据结构中

DataFrame.groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,squeeze=False,observed=False)

by 映射,字典或Series对象、数组、标签或标签列表。如果by是一个函数,则对象索引的每个值调用它。如果传递了一个字典或Series对象,则使用该字典或Series对象值来确定组。如果传递了数组ndarray,则按原样使用这些值为确定组

axis axis=1表示行,axis=0表示列(默认)

level 表示索引层级,默认无

as_index 布尔型,默认为True,返回以组标签为索引的对象

sort 对组进行排序,布尔型,默认为True

group_keys 布尔型,默认为True,调用apply函数时,将分组的键添加到索引以标识片段

squeeze 布尔型,默认为False,如果可能,减少返回类型的维度,否则返回一致类型

observed 当以石斑鱼为分类时,才会使用该参数。如果参数值为True,则仅显示分类石斑鱼的观测值。如果为False,则显示分类石斑鱼的所有值

返回值 DataFrameGroupBy,返回包含有关组的信息的groupby对象

# 根据一级分类统计订单数据

import pandas as pd

# 设置数据显示的列数和宽度

pd.set_option('display.max_columns', 500)

pd.set_option('display.width', 1000)

pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('JD.xlsx')

df1 = df[['一级分类','7天点击量','订单预定']]

print(df1.groupby('一级分类').sum())

7天点击量  订单预定

一级分类

数据库                    186        15

移动开发                  261        7

编程语言与程序设计      4280      192

网页制作/Web技术          345        15

【按照多列分组统计】

# 根据两级分类统计订单数据

import pandas as pd

# 设置数据显示的列数和宽度

pd.set_option('display.max_columns', 500)

pd.set_option('display.width', 1000)

pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('JD.xlsx')

df1 = df[['一级分类','二级分类','7天点击量','订单预定']]

print(df1.groupby(['一级分类','二级分类']).sum())

7天点击量  订单预定

一级分类          二级分类

数据库            Oracle              58        2

SQL                128        13

移动开发          Android            261        7

编程语言与程序设计 ASP.NET              87        2

C#                  314        12

C++/C语言          724        28

JSP/JavaWeb        157        1

Java                408        16

PHP                113        1

Python            2449      132

Visual Basic        28        0

网页制作/Web技术  HTML                188        8

JavaScript          100        7

WEB前端              57        0

【分组并按指定列进行数据计算】

# 统计各编程语言的7天点击量

import pandas as pd

# 设置数据显示的列数和宽度

pd.set_option('display.max_columns', 500)

pd.set_option('display.width', 1000)

pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('JD.xlsx')

df1 = df[['一级分类','二级分类','7天点击量','订单预定']]

print(df1.groupby('二级分类')['7天点击量'].sum())

二级分类

ASP.NET          87

Android          261

C#              314

C++/C语言        724

HTML            188

JSP/JavaWeb      157

Java            408

JavaScript      100

Oracle            58

PHP              113

Python          2449

SQL              128

Visual Basic      28

WEB前端          57

Name: 7天点击量, dtype: int64

【对分组数据进行迭代】

# 迭代一级分类的订单数据

import pandas as pd

# 设置数据显示的列数和宽度

pd.set_option('display.max_columns', 500)

pd.set_option('display.width', 1000)

pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('JD.xlsx')

df1 = df[['一级分类','二级分类','7天点击量','订单预定']]

for name,group in df1.groupby('一级分类'):

print(name)

print(group)

数据库

一级分类 二级分类  7天点击量  订单预定

25  数据库  Oracle        58        2

27  数据库      SQL        128        13

移动开发

一级分类 二级分类  7天点击量  订单预定

10  移动开发  Android        85        4

19  移动开发  Android        32        1

24  移动开发  Android        85        2

28  移动开发  Android        59        0

编程语言与程序设计

一级分类      二级分类  7天点击量  订单预定

0  编程语言与程序设计      ASP.NET        35        1

1  编程语言与程序设计          PHP        49        0

2  编程语言与程序设计          Java        51        2

3  编程语言与程序设计          PHP        64        1

4  编程语言与程序设计  JSP/JavaWeb        26        0

5  编程语言与程序设计            C#        60        1

6  编程语言与程序设计    C++/C语言        227        11

8  编程语言与程序设计            C#        122        3

9  编程语言与程序设计    C++/C语言        111        5

11  编程语言与程序设计    C++/C语言        165        5

12  编程语言与程序设计  JSP/JavaWeb        131        1

13  编程语言与程序设计          Java        149        10

15  编程语言与程序设计        Python      1139        79

16  编程语言与程序设计          Java        125        1

18  编程语言与程序设计    C++/C语言        149        4

20  编程语言与程序设计      ASP.NET        52        1

21  编程语言与程序设计        Python        597        25

22  编程语言与程序设计        Python        474        15

23  编程语言与程序设计          Java        83        3

26  编程语言与程序设计            C#        132        8

29  编程语言与程序设计    C++/C语言        27        2

30  编程语言与程序设计        Python        239        13

31  编程语言与程序设计    C++/C语言        45        1

32  编程语言与程序设计  Visual Basic        28        0

网页制作/Web技术

一级分类    二级分类  7天点击量  订单预定

7  网页制作/Web技术  JavaScript        100        7

14  网页制作/Web技术        HTML        188        8

17  网页制作/Web技术    WEB前端        57        0

【迭代两级分类的订单数据】

import pandas as pd

# 设置数据显示的列数和宽度

pd.set_option('display.max_columns', 500)

pd.set_option('display.width', 1000)

pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('JD.xlsx')

df1 = df[['一级分类','二级分类','7天点击量','订单预定']]

for (key1,key2),group in df1.groupby(['一级分类','二级分类']):

print(key1,key2)

print(group)

一级分类 二级分类  7天点击量  订单预定

25  数据库  Oracle        58        2

数据库 SQL

一级分类 二级分类  7天点击量  订单预定

27  数据库      SQL        128        13

移动开发 Android

一级分类 二级分类  7天点击量  订单预定

10  移动开发  Android        85        4

19  移动开发  Android        32        1

24  移动开发  Android        85        2

28  移动开发  Android        59        0

编程语言与程序设计 ASP.NET

一级分类 二级分类  7天点击量  订单预定

0  编程语言与程序设计  ASP.NET        35        1

20  编程语言与程序设计  ASP.NET        52        1

编程语言与程序设计 C#

一级分类 二级分类  7天点击量  订单预定

5  编程语言与程序设计      C#        60        1

8  编程语言与程序设计      C#        122        3

26  编程语言与程序设计      C#        132        8

编程语言与程序设计 C++/C语言

一级分类  二级分类  7天点击量  订单预定

6  编程语言与程序设计  C++/C语言        227        11

9  编程语言与程序设计  C++/C语言        111        5

11  编程语言与程序设计  C++/C语言        165        5

18  编程语言与程序设计  C++/C语言        149        4

29  编程语言与程序设计  C++/C语言        27        2

31  编程语言与程序设计  C++/C语言        45        1

编程语言与程序设计 JSP/JavaWeb

一级分类    二级分类  7天点击量  订单预定

4  编程语言与程序设计  JSP/JavaWeb        26        0

12  编程语言与程序设计  JSP/JavaWeb        131        1

编程语言与程序设计 Java

一级分类 二级分类  7天点击量  订单预定

2  编程语言与程序设计    Java        51        2

13  编程语言与程序设计    Java        149        10

16  编程语言与程序设计    Java        125        1

23  编程语言与程序设计    Java        83        3

编程语言与程序设计 PHP

一级分类 二级分类  7天点击量  订单预定

1  编程语言与程序设计      PHP        49        0

3  编程语言与程序设计      PHP        64        1

编程语言与程序设计 Python

一级分类 二级分类  7天点击量  订单预定

15  编程语言与程序设计  Python      1139        79

21  编程语言与程序设计  Python        597        25

22  编程语言与程序设计  Python        474        15

30  编程语言与程序设计  Python        239        13

编程语言与程序设计 Visual Basic

一级分类      二级分类  7天点击量  订单预定

32  编程语言与程序设计  Visual Basic        28        0

网页制作/Web技术 HTML

一级分类 二级分类  7天点击量  订单预定

14  网页制作/Web技术    HTML        188        8

网页制作/Web技术 JavaScript

一级分类    二级分类  7天点击量  订单预定

7  网页制作/Web技术  JavaScript        100        7

网页制作/Web技术 WEB前端

一级分类 二级分类  7天点击量  订单预定

17  网页制作/Web技术  WEB前端        57        0

【针对不同的列使用不同的聚合函数】

# 按一级分类分组统计7天点击量、订单预定的平均值总和以及订单预定总和

import pandas as pd

# 设置数据显示的列数和宽度

pd.set_option('display.max_columns', 500)

pd.set_option('display.width', 1000)

pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('JD.xlsx')

df1 = df[['一级分类','二级分类','7天点击量','订单预定']]

print(df1.groupby('一级分类').agg({'7天点击量':['mean','sum'],'订单预定':['sum']}))

7天点击量      订单预定

mean  sum      sum

一级分类

数据库              93.000000  186      15

移动开发            65.250000  261        7

编程语言与程序设计  178.333333  4280      192

网页制作/Web技术    115.000000  345      15

【通过自定义函数实现分组统计】

# 统计1月份销售数据中,购买次数最多的产品

import pandas as pd

# 设置数据显示的列数和宽度

pd.set_option('display.max_columns', 500)

pd.set_option('display.width', 1000)

pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('1月.xlsx')

max1 = lambda x: x.value_counts(dropna=False).index[0]

max1.__name__ = "购买次数最多"

df1= df.agg({

'宝贝标题':[max1],

'数量':['sum','mean'],

'买家实际支付金额':['sum','mean']

})

print(df1)

宝贝标题  数量  买家实际支付金额

购买次数最多  零基础学Python    NaN              NaN

sum                      NaN  53.00        2528.5600

mean                    NaN  1.06          50.5712

# 通过字典分组统计“北上广”的销量

import pandas as pd

# 设置数据显示的列数和宽度

pd.set_option('display.max_columns', 500)

pd.set_option('display.width', 1000)

pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('JD2.xlsx')

df = df.set_index(['商品名称'])

dict1={

'上海出库销量':'北上广','北京出库销量':'北上广',

'广州出库销量':'广州','成都出库销量':'成都',

'武汉出库销量':'武汉','西安出库销量':'西安',

}

df1 = df.groupby(dict1, axis=1).sum()

print(df1)

北上广  广州  成都  武汉  西安

商品名称

零基础学Python(全彩版)            1413  578  284  246  152

Python从入门到项目实践(全彩版)    568  230  113    92    63

Python项目开发案例集锦(全彩版)    451  189  115    88    57

Python编程锦囊(全彩版)            321  136    85    65    47

零基础学C语言(全彩版)              249  115    82    63    40

SQL即查即用(全彩版)                217    88    29    25    40

零基础学Java(全彩版)              157    81    48    43    29

零基础学C++(全彩版)                148    75    53    35    23

零基础学C#(全彩版)                  95    51    27    16    7

C#项目开发实战入门(全彩版)          93    42    18    22    12

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/106092
 
303 次点击