转载自知乎:侦探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)