Python中groupby的简单使用

首先先创建一个表格:

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

得到的df表格如下所示:

key1 key2 data1 data2
0 a one -0.146141 0.074790
1 a two -0.474247 0.758113
2 b one -1.379679 1.863705
3 b two -0.290600 -0.228977
4 a one 0.832128 0.857522

1、使用单特征对表格进行划分

现在先简单使用表格中的特征’key1’对数据进行划分:

grouped=df.groupby(['key1'])
for name ,group in grouped:
    print(name)
    print(group)

得到的划分结果如下所示:

Python中groupby的简单使用_第1张图片
通过上面这个图可以发现grouped=df.groupby([‘key1’])的作用是根据“key1”的不同值将表格df分为两个部分,第一个部分是“key1=a”,第二个部分是“key1=b”。用其它特征进行划分原理一样。

现在我们不仅是用“key1”对表格进行划分,同时还要对划分之后的表格求其中特征的均值,例如用以下代码求划分后的特征的均值:

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

其输出结果如下:
在这里插入图片描述
通过上图可以发现,通过“key1”对表格df划分为两部分之后,再对两部分中的“data1”和“data2”进行求平均值操作。这里不对“key2”进行求平均值操作,因为特征“key2”是文本类信息,没有平均值,所以不进行求平均值操作。

2、使用多特征对表格进行划分

上面讨论了使用一个特征对表格df进行分组,现在使用多个特征对表格df进行划分,简单地分析,使用特征“key1”和“key2”对表格进行划分,那会输出什么呢?输入以下代码:

for name, group in df.groupby(['key1','key2']):
    print("划分的特征值:",name)
    print(group,'\n')

得到的输出结果如下:
Python中groupby的简单使用_第2张图片
通过上面这个图可以发现,因为现在要使用两个特征对表格进行划分,特征“key1”和特征“key2”同样有两个类别,因此组合得到的划分情况有四种,根据不同的划分组合得到符合要求的划分表格,这样就得到了上图中的情况。当使用三个或者四个特征对表格进行划分的时候,组合的个数更多,同时会划分得更加细致。具体原理是一样的。

2.1 对表格中的部分特征进行划分

在上面介绍多特征对表格进行划分的时候,我们是基于整个表格进行划分的,如果我们只想针对其中的部分特征进行划分,具体又该怎么操作呢?我们现有有下面这个表格,如果我们只想对其中的“data1”和“data2”基于“key1”进行划分,该怎么操作呢?
Python中groupby的简单使用_第3张图片
输入以下代码:

for name, group in df[['data1','data2','key1']].groupby(['key1']):
    print("划分的特征值:",name)
    print(group,'\n')

得到的输出结果如下图所示:
Python中groupby的简单使用_第4张图片
其实这个和最开始介绍的对整个表格进行划分的原理是一样的,但是需要注意的是,代码不能写成下面的形式:

for name, group in df[['data1','data2']].groupby(['key1']):
    print("划分的特征值:",name)
    print(group,'\n')

这样的代码是错误的,这段代码和前一段代码的差别主要在于df[[‘data1’,‘data2’]]中没有了’key1’,这样是不行的,因为这样的意思是我们选取了表格中的’data1’列和’data2’列,但是没有选取’key1’列,这样数据中没有’key1’,是没有办法进行划分的。

3、具体应用在什么地方

上面说了很多对于groupby的功能介绍,但是这个东西究竟能用在什么地方呢?这里简单举一个例子。

现在有一个场景,有两家商店1和2,每家商店有a,b,c三种商品,每家商店的每种商品都有各自的日销售额,现在要快速得到每家商店每种商品的月销售额,那么我们就可以使用groupby来进行操作。

具体的数据如下:

import pandas as pd
df = pd.DataFrame({'shop_id':list('111111222222'),
                  'item_id': list('abcabcabcabc'),
                  'item_daysales': list([1,2,3,4,5,6,1,2,3,4,5,6])})
df

我们得到的表格具体如下所示:

shop_id item_id item_daysale
0 1 a 1
1 1 b 2
2 1 c 3
3 1 a 4
4 1 b 5
5 1 c 6
6 2 a 1
7 2 b 2
8 2 c 3
9 2 a 4
10 2 b 5
11 2 c 6

现在我们需要计算每家商店每种商品的月销售额,使用groupby进行操作,具体代码如下:

grouped = df.groupby(['shop_id','item_id']).sum().reset_index()
grouped.rename(columns={'item_daysale' : 'item_monthsale'})

代码中的第一步是使用“shop_id”和“item_id”对表格进行分类,这样因为商店有两种,商品有三种,对于每一家商店都有三种情况,划分后记进行求和操作就可以得到每家商店的月销售额,代码中的resent_index()的作用是保留作为划分的“shop_id”和“item_id”,如果去掉则输出的是另一种表格形式。第二段代码是对其中的“item_daysale”特征进行改名。

这样得到的最后的输出如下如所示:

shop_id item_id item_monthsale
0 1 a 5
1 1 b 7
2 1 c 9
3 2 a 5
4 2 b 7
5 2 c 9

这样便完成了对销售额的月总和计算。

如果我们代码中没有输入resent_index(),则输出如下所示:

shop_id item_id item_monthsale
1 a 5
b 7
c 9
2 a 5
b 7
c 9

这并不是我们想要的输出,我们希望输出的列项有“shop_id”,“item_id”和“item_monthsale”。所以得根据具体需要什么来写代码实现。

——————————
参考博客:https://blog.csdn.net/youngbit007/article/details/54288603

你可能感兴趣的:(python数据分析函数作用,python,pandas,开发语言)