如何使用groupby函数对数据进行分组(1)

转载自知乎:侦探L 如何使用groupby函数对数据进行分组(1) - 知乎

在使用python进行数据分析的过程中,采用groupby函数对数据进行分组是一项很常用的操作,它可以帮助我们更清晰地了解我们所用数据的组成及规律,本节将为大家简单介绍一下如果使用groupby函数对数据进行分组的具体做法。

1、函数说明(什么是数据分组?具体要做什么)

总的来说,实现数据分组这一操作总共可以分成三步:

split→apply→combine

(1)第一步,split(分)。按照键值(key)或者分组变量将数据分组。

(2)第二步,apply(用)。对于第一步分组后的数据,应用函数进行计算(可以是python自带的函数,可以是我们自己编写的函数)。

(3)第三步,combine(合)。将经过第二步计算后的结果进行聚合。

放个图方便大家理解:

(图网侵删)

2、还是老规矩,举个例子动手操作一下:

首先还是用pandas做一个实验用的数据表:

import pandas as pd
import numpy as np

df = pd.DataFrame({'data1' : ['a', 'b', 'c', 'b', 'a'],
    'data2' : ['one', 'one', 'one', 'two', 'one'],
    'num1' : [1,2,3,4,5],
    'num2' : [6,7,8,9,10]})
df

运行一下看看结果:

可以看到这是一个5行4列的数据表,下面进行实验操作:

(1)首先,我们将data1当做我们的分组键值,对num1进行分组:

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

注意~这里的grouped不再是一个数据框,而是一个GroupBy对象,我们可以看一下它的数据类型:

再次注意~在这一步,我们并没有进行任何计算,仅仅是创建用data1分组后创建了一个GroupBy对象,下面我们将针对这个对象进行函数计算。

(2)在第一步的基础上求均值(mean)以及求和(sum)。

可以看到,运算结果与我们预期相符。

(3)使用两个分组变量对数据进行分组操作

刚刚我们将data1当做我们的分组键值,只用了一个变量来分组,实际上我们可以使用多个分组变量进行数据分组操作,下面我们将data1和data2都作为分组变量:

group2= df['num2'].groupby([df['data1'], df['data2']])
mean_group2=group2.mean()
mean_group2

可以看到,数据结果同样符合我们的预期。

(4)上面分组变量都是我们的数据表df内部的Series,实际上,只要是和data等长的数组都可以进行类似操作,比如:

我们定义如下两个数组(array),再看看用groupby会发生什么。

city = np.array(['beijing', 'shenzhen', 'shenzhen', 'beijing', 'beijing'])
years = np.array([2019,2020,2019,2020,2020])
df['num1'].groupby([city, years]).mean()

可以看到,原来的数据表还是照我们的要求进行分组了。(get!)

3、尝试对分组进行迭代

实际上在我们的数据过程中,我们的GroupBy对象是支持迭代操作的。这样做的话,可以产生一个由分组变量名和数据块组成的元组:

for num,data in df.groupby('data1'):
    print(num)
    print(data)

可以看到,输出结果变成元组了(把表格分开了)。

如何我们想要用两个分组变量进行分组怎么办呢?也是可以的。

下面我们来看看用两个分组变量时会发生什么:

for (d1,d2),  num in df.groupby(['data1','data2']):
    print (d1,d2)
    print (num)

依旧完美输出!分组变量变成了两个。

我们可以将上面的结果转化为list(列表),来看看结果是什么样的:

list(df.groupby(['data1','data2']))

再来看看这个列表的第一个元素长什么样:

list(df.groupby(['data1','data2']))[0]

可以转成字典吗?答案是肯定的。我们也可以将结果转化为dict(字典):

dict(list(df.groupby(['data1','data2'])))

同样的,我们看看第一个元素:

dict(list(df.groupby(['data1','data2'])))["a","one"]

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

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

注意~分组的时候,下面两种表达方式都是一样的~

(1)df.groupby('key1')['data1']

(2)df.data1.groupby(df.key1)


  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值