Pandas数据分析groupby函数深度总结(1)

  • groupby分组数据
    • 加载数据
    • 数据分组
      • 按'Sales Rep'列分组
      • 显示所有分组
      • 选择一个特定的组
      • 计算每组中的行数
      • 按'Sales Rep'中的姓分组
      • 按'Sales Rep'中是否包含有“William”分组
      • 按随机序列分组
      • 按'Val'列分位数分成三组
      • 按制定的'Val'列的范围进行分组
      • pd.Grouper
        • Grouping by year
        • 按季度或其他频率分组
      • 通过多列进行分组

pandas包最强大的函数之一,当属groupby了。但是大多数人对groupby函数研究是很少的,只会使用其中的一小部分功能。

groupby函数允许对数据集采用拆分-应用-组合的方法。这种方法通常用于对数据进行切片和分块,以便数据分析师能够回答特定的问题。

groupby可以做到:

  1. 根据列/条件将数据分组;
  2. 对所有组应用一个函数/转换,并将结果合并为一个输出。

本次深度总结主要有以下两个部分:

  1. groupby分组数据;
  2. 应用函数/转换:apply , agg(regate) , transform 以及 filter,然后合并数据。

本文为系列(1),总结groupby分组数据,代码采用jupyter notebook演示。

groupby分组数据

加载数据

我们使用一个虚构的销售部门的数据。该数据集包括虚构的销售代表、订单引导、交易可能完成的公司、订单值和引导日期等列。
输入:

order_leads = pd.read_csv('https://raw.githubusercontent.com/FBosler/Medium-Data-Exploration/master/order_leads.csv',parse_dates = [3]
)
sales_team = pd.read_csv('https://raw.githubusercontent.com/FBosler/Medium-Data-Exploration/master/sales_team.csv',parse_dates = [3]
)
df = pd.merge(order_leads,sales_team,on=['Company Id','Company Name'])
df = df.rename(columns={'Order Value':'Val','Converted':'Sale'})
df

输出:

Order Id Company Id  Company Name    Date    Val Sale    Sales Rep   Sales Rep Id
0   HZSXLI1IS9RGABZW    D0AUXPP07H6AVSGD    Melancholy Social-Role  2017-10-13  6952    0   William Taylor  ZTZA0ZLYZR85PTUJ
1   582WPS3OW8T6YT0R    D0AUXPP07H6AVSGD    Melancholy Social-Role  2017-09-02  7930    0   William Taylor  ZTZA0ZLYZR85PTUJ
2   KRF65MQZBOYG4Y9T    D0AUXPP07H6AVSGD    Melancholy Social-Role  2016-12-21  5538    1   William Taylor  ZTZA0ZLYZR85PTUJ
3   N3EDZ5V1WGSWW828    D0AUXPP07H6AVSGD    Melancholy Social-Role  2018-06-03  1113    0   William Taylor  ZTZA0ZLYZR85PTUJ
4   QXBC8COXEXGFSPLP    D0AUXPP07H6AVSGD    Melancholy Social-Role  2014-07-26  4596    0   William Taylor  ZTZA0ZLYZR85PTUJ
... ... ... ... ... ... ... ... ...
99995   HKZFX556ZQRZJZWR    APH243SK72T90MPS    Trade-Preparatory Quarterbacks  2017-11-06  7516    0   Ida Woodward    LF3CPWWZKSNB1AXI
99996   962CSDMAJ49E0CRK    APH243SK72T90MPS    Trade-Preparatory Quarterbacks  2018-08-02  442 1   Ida Woodward    LF3CPWWZKSNB1AXI
99997   ZW7RO9TLL6EVVJEC    APH243SK72T90MPS    Trade-Preparatory Quarterbacks  2014-11-02  8544    0   Ida Woodward    LF3CPWWZKSNB1AXI
99998   LNKGIWMZ9RT49IE9    APH243SK72T90MPS    Trade-Preparatory Quarterbacks  2017-04-01  6650    0   Ida Woodward    LF3CPWWZKSNB1AXI
99999   X9Y21H4JWX6OGC2Z    APH243SK72T90MPS    Trade-Preparatory Quarterbacks  2016-07-27  953 0   Ida Woodward    LF3CPWWZKSNB1AXI
100000 rows × 8 columns

数据分组

调用groupby的默认方法是明确提供列名以拆分数据集。然而,这是鲜为人知的是,也可以传递一个Series数据到groupby来分组。唯一限制是该Series与DataFrame具有相同的长度。这意味着可以通过列的已处理版本进行组,而无需为此创建新的辅助列。

按’Sales Rep’列分组

输入:

grouped = df.groupby('Sales Rep')
grouped

输出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f3b06e835e0>

现在创建了一个dataframe的groupby对象。 让我们进一步分析:

显示所有分组

调用分组对象上的组返回每个组的索引列表(因为每行可以通过其索引唯一识别)

输入:

grouped.groups

输出:

{'Aaron Hendrickson': Int64Index(
[25612, 25613, 25614, 25615, 25616, 25617, 25618, 25619, 25620, 25621,..., 25894, 25895, 25896, 25897, 25898, 25899, 25900, 25901, 25902, 25903], dtype='int64', length=292
),
'Adam Sawyer': Int64Index(
[67140, 67141, 67142, 67143, 67144, 67145, 67146, 67147, 67148, 67149, ..., 67454, 67455, 67456, 67457, 67458, 67459, 67460, 67461, 67462, 67463], dtype='int64', length=324
),
...
'Yvonne Lindsey': Int64Index([20384, 20385, 20386, 20387, 20388, 20389, 20390, 20391, 20392, 20393, 20394, 20395, 20396, 20397, 20398, 20399, 20400, 20401, ... , 20447, 20448, 20449, 20450], dtype='int64', length=67)
}

选择一个特定的组

调用get_group函数,可以返回相应的数据子集。

输入:

grouped.get_group('Aaron Hendrickson')

输出:

Order Id Company Id  Company Name    Date    Val Sale    Sales Rep   Sales Rep Id
25612   3BJY12LWBN7D0GJL    CE4544HJOFMONMH2    Follow-Up Boundary  2014-09-04  1940    0   Aaron Hendrickson   AEMLQ09IYM72ACBL
25613   W3HHOSC1H6A1PW37    CE4544HJOFMONMH2    Follow-Up Boundary  2015-09-24  2109    0   Aaron Hendrickson   AEMLQ09IYM72ACBL
25614   G9JKIZO4WD945GBH    CE4544HJOFMONMH2    Follow-Up Boundary  2014-12-06  4300    1   Aaron Hendrickson   AEMLQ09IYM72ACBL
25615   BKIJVKZ7REVN6P8B    CE4544HJOFMONMH2    Follow-Up Boundary  2017-05-07  3026    0   Aaron Hendrickson   AEMLQ09IYM72ACBL
25616   WFHGWR4PAD04A2GJ    CE4544HJOFMONMH2    Follow-Up Boundary  2016-01-20  5033    0   Aaron Hendrickson   AEMLQ09IYM72ACBL
... ... ... ... ... ... ... ... ...
25899   NATK7K3TZUH32BBE    CGDGXAW6GNU6JIEG    Fiftieth Art'S 2015-01-27  6095    1   Aaron Hendrickson   AEMLQ09IYM72ACBL
25900   EGD6IRB0UML62XB0    CGDGXAW6GNU6JIEG    Fiftieth Art'S 2018-11-04  7652    1   Aaron Hendrickson   AEMLQ09IYM72ACBL
25901   9Z18A7D1T8EUH58D    CGDGXAW6GNU6JIEG    Fiftieth Art'S 2016-05-08  4746    0   Aaron Hendrickson   AEMLQ09IYM72ACBL
25902   R0LUW64V2F3O2HSD    CGDGXAW6GNU6JIEG    Fiftieth Art'S 2017-02-16  6158    0   Aaron Hendrickson   AEMLQ09IYM72ACBL
25903   UMHMBM5M179IHX6D    CGDGXAW6GNU6JIEG    Fiftieth Art'S 2017-07-28  2164    0   Aaron Hendrickson   AEMLQ09IYM72ACBL
292 rows × 8 columns

计算每组中的行数

为了演示一些高级分组功能,将通过使用apply步骤的最简单版本:size方法(计算每个组中的行数)。这样做可以专注于groupby的应用。

输入:

grouped.size()

输出:

Sales Rep
Aaron Hendrickson    292
Adam Sawyer          324
Adele Kimmel         115
Adrian Daugherty     369
Adrianna Shelton      37...
Willie Lin            44
Willie Rau            95
Willie Sanchez       309
Yvonne Jones          74
Yvonne Lindsey        67
Length: 499, dtype: int64

按’Sales Rep’中的姓分组

下面的例子是通过’Sales Rep’这个列的变体分组。原来的分组方法只能是通过创建辅助列的方法来分组,这个方法可以避免修改原数据,保证原数据不被污染。
通过使用str方法提取人名中的姓。
输入:

df.groupby(df['Sales Rep'].str.split(' ').str[0]
).size()

输出:

Sales Rep
Aaron        292
Adam         324
Adele        115
Adrian       369
Adrianna      37...
Wesley       144
Wilbert      213
William     1393
Willie       448
Yvonne       141
Length: 318, dtype: int64

按’Sales Rep’中是否包含有“William”分组

输入:

df.groupby(df['Sales Rep'].apply(lambda x: 'William' in x)
).size()

输出:

Sales Rep
False    97111
True      2889
dtype: int64

按随机序列分组

输入:

df.groupby(pd.Series(np.random.choice(list('ABCDG'),len(df)))
).size()

输出:

A    19852
B    19949
C    20184
D    19912
G    20103
dtype: int64

按’Val’列分位数分成三组

输入:

df.groupby(pd.qcut(x=df['Val'],q=3,labels=['low','mid','high'])
).size()

输出:

Val
low     33339
mid     33336
high    33325
dtype: int64

按制定的’Val’列的范围进行分组

输入:

df.groupby(pd.cut(df['Val'],[0,3000,5000,7000,10000])
).size()

输出:

Val
(0, 3000]        29220
(3000, 5000]     19892
(5000, 7000]     20359
(7000, 10000]    30529
dtype: int64

pd.Grouper

pd.Grouper是很重要的一个函数,在处理时间序列数据时非常有用。

Grouping by year

api使用样例:pd.Grouper(key=, freq=),通过该函数可以根据指定列的指定时间频率对数据进行分组。本例中对’Date’列按’Y’进行分组。

输入:

df.groupby(pd.Grouper(key='Date',freq='Y')).size()

输出:

Date
2014-12-31    19956
2015-12-31    20054
2016-12-31    20133
2017-12-31    20079
2018-12-31    19778
Freq: A-DEC, dtype: int64

按季度或其他频率分组

除了按’Y’分组,还可以按’D’,‘W’,‘M’,或者’Q’分组,具体如下表:


输入:

df.groupby(pd.Grouper(key='Date',freq='SM')).size()

输出:

Date
2013-12-31    761
2014-01-15    837
2014-01-31    820
2014-02-15    740
2014-02-28    817...
2018-10-31    810
2018-11-15    805
2018-11-30    824
2018-12-15    837
2018-12-31     50
Freq: SM-15, Length: 121, dtype: int64

通过多列进行分组

输入:

df.groupby(['Sales Rep','Company Name']).size()

输出:

Sales Rep          Company Name
Aaron Hendrickson  6-Foot Homosexuals             2063D House'S                    27Angular Liberalism             28Boon Blish'S                   18Business-Like Structures       21..
Yvonne Jones       Entry-Limiting Westinghouse    20Intractable Fairgoers          18Smarter Java                   17
Yvonne Lindsey     Meretricious Fabrication       28Shrill Co-Op                   39
Length: 4619, dtype: int64

Pandas数据分析groupby函数深度总结(1)相关推荐

  1. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的指数权重移动(滚动)平均、例如,计算某公司的多个店铺每N天(5天)的滚动销售额指数权重移动(滚动)平均

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的指数权重移动(滚动)平均(Exponential Moving Average).例如,计算某公司的多个店铺每N天(5 ...

  2. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max).例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值 目录

  3. pandas使用groupby函数计算dataframe每个分组对应的数据行的个数(size of each group in dataframe, rows count of group)

    pandas使用groupby函数计算dataframe每个分组对应的数据行的个数(size of each group in dataframe, rows count of group) 目录

  4. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动计数个数(rolling count)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额计数个数

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动计数个数(rolling count).例如,计算某公司的多个店铺每N天(5天)的滚动销售额计数个数 目录

  5. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动标准差(rolling std)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额标准差

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动标准差(rolling std).例如,计算某公司的多个店铺每N天(5天)的滚动销售额标准差 目录

  6. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动加和(rolling sum)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额加和

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动加和(rolling sum).例如,计算某公司的多个店铺每N天(5天)的滚动销售额加和 目录

  7. pandas使用groupby函数计算dataframe数据中每个分组的滚动统计值(rolling statistics)的语法:例如分组的N天滚动平均值、滚动中位数、滚动最大最小值、滚动加和等

    pandas使用groupby函数计算dataframe数据中每个分组的滚动统计值(rolling statistics)的语法:例如分组的N天滚动平均值.滚动中位数.滚动最大最小值.滚动加和等 目录

  8. pandas使用groupby函数和agg函数获取每个分组特定变量独特值的个数(number of distinct values in each group in dataframe)

    pandas使用groupby函数和agg函数获取每个分组特定变量独特值的个数(number of distinct values in each group in dataframe) 目录

  9. pandas使用groupby函数、first函数、last函数分别获得每个分组的第一行和最后一行数据(first/last row of each group in dataframe)

    pandas使用groupby函数.first函数.last函数分别获得每个分组的第一行和最后一行数据(first/last row of each group in dataframe) 目录

最新文章

  1. linux查看当前的工作目录,Linux-查看当前工作目录(pwd)
  2. Windows Socket 最大连接数
  3. 一条SQL语句在MySQL中是如何执行的
  4. 计算机信息应用知识题库,计算机基础知识题库(含答案).doc
  5. 摄像头图像分析目标物体大小位置_小目标检测的增强算法
  6. 结构重参数化技术【为了模型压缩】:进可暴力提性能,退可无损做压缩
  7. php中全局变量如何设置,如何在php中声明全局变量?
  8. java实现复原IP地址_LeetCode 力扣 93. 复原IP地址
  9. android手机网络Ping测试
  10. python竖线_python画横线竖线作为分界线
  11. 社区团长资金分账该如何高效解决呢?
  12. Studio3T安装
  13. box-shadow单边阴影设置
  14. Web实现:仿大学英语四级成绩查询 html css 含效果图
  15. 一分钟详解智能快递柜电子锁结构
  16. 36氪独家|「秦汉胡同」完成1亿元A轮融资,将发力线上内容产品和女性生活学习服务社群...
  17. Unity-Timeline制作动画(快来制作属于你的动画吧)
  18. 尚硅谷周阳老师2020最新Springcloud完整版学习
  19. 【西祠日志】【19】【20】有人说,21天可以养一种习惯
  20. ph1 android p,ph1(安卓之父ph1参数)

热门文章

  1. 哪一个属于计算机外存储器,下边哪一个属于计算机的外存储器()
  2. 【2021】01 最大流
  3. Nvidia jetson tx2 ubuntu16.04插入128GB内存卡报错:Unable to access/mount “128 GB Volume”
  4. iphone 热点 android,苹果手机的热点安卓机可以连接吗(图文)
  5. Opencv基于改进VGG19的表情识别系统(源码&Fer2013&教程)
  6. 如何找到官方公布的和汇丰公布的PMI数据
  7. linux 安装Docker
  8. KubeVela 1.3 发布:开箱即用的可视化应用交付平台,引入插件生态、权限认证、版本化等企业级新特性
  9. 五尺天涯 经典台词:岁月易流逝,珍惜眼前人。
  10. Java网课简易飞机大战