分组与聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况 

1、什么是分组与聚合?

分组聚合原理

 

2、分组API

  • DataFrame.groupby(key, as_index=False)
    • key:分组的列数据,可以多个
  • 案例:不同颜色的不同笔的价格数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
col =pd.DataFrame({'color': ['white','red','green','red','green'],
 'object':['pen','pencil','pencil','ashtray','pen'],
'price1':[5.56,4.20,1.30,0.56,2.75],
'price2':[4.75,4.12,1.60,0.75,3.15]})

col
 colorobjectprice1price2
0whitepen5.564.75
1redpencil4.204.12
2greenpencil1.301.60
3redashtray0.560.75
4greenpen2.753.15
  • 进行分组,对颜色分组,price进行聚合
# 分组,求平均值
col.groupby(['color'])['price1'].mean()
'''
color
green    2.025
red      2.380
white    5.560
Name: price1, dtype: float64
'''
col['price1'].groupby(col['color']).mean()
'''
color
green    2.025
red      2.380
white    5.560
Name: price1, dtype: float64
'''
# 分组,数据的结构不变
col.groupby(['color'], as_index=False)['price1'].mean()
	color	price1
0	green	2.025
1	red	2.380
2	white	5.560

 

3、星巴克零售店铺数据

现在我们有一组关于全球星巴克店铺的统计数据,如果我想知道美国的星巴克数量和中国的哪个多,或者我想知道中国每个省份星巴克的数量的情况,那么应该怎么办?数据来源:https://www.kaggle.com/starbucks/store-locations/data

3.1 数据获取 

# 导入星巴克店的数据
starbucks = pd.read_csv("./data/starbucks/directory.csv")

starbucks.head()
 BrandStore NumberStore NameOwnership TypeStreet AddressCityState/ProvinceCountryPostcodePhone NumberTimezoneLongitudeLatitude
0Starbucks47370-257954Meritxell, 96LicensedAv. Meritxell, 96Andorra la Vella7ADAD500376818720GMT+1:00 Europe/Andorra1.5342.51
1Starbucks22331-212325Ajman Drive ThruLicensed1 Street 69, Al JarfAjmanAJAENaNNaNGMT+04:00 Asia/Dubai55.4725.42
2Starbucks47089-256771Dana MallLicensedSheikh Khalifa Bin Zayed St.AjmanAJAENaNNaNGMT+04:00 Asia/Dubai55.4725.39
3Starbucks22126-218024Twofour 54LicensedAl Salam StreetAbu DhabiAZAENaNNaNGMT+04:00 Asia/Dubai54.3824.48
4Starbucks17127-178586Al Ain TowerLicensedKhaldiya Area, Abu Dhabi IslandAbu DhabiAZAENaNNaNGMT+04:00 Asia/Dubai54.5424.51

3.2 进行分组聚合 

# 按照国家分组,求出每个国家的星巴克零售店数量
count = starbucks.groupby(['Country']).count()

画图显示结果 

count['Brand'].plot(kind='bar', figsize=(20, 8))  #计算brand的数据
plt.show()

count['Brand'].sort_values(ascending=False)[:20]
'''
Country
US    13608
CN     2734
CA     1468
JP     1237
KR      993
GB      901
MX      579
TW      394
TR      326
PH      298
TH      289
ID      268
MY      234
DE      160
AE      144
FR      132
SG      130
RU      109
AR      108
KW      106
Name: Brand, dtype: int64
'''
count['Brand'].sort_values().plot(kind='bar', figsize=(20, 8))  #计算brand的数据
plt.show()

假设我们加入省市一起进行分组 

# 设置多个索引,set_index()
starbucks.groupby(['Country', 'State/Province']).count()
BrandStore NumberStore NameOwnership TypeStreet AddressCityPostcodePhone NumberTimezoneLongitudeLatitude
CountryState/Province           
AD711111111111
AEAJ22222200222
AZ484848484848720484848
DU8282828282821650828282
FU22222210222
.......................................
USWV2525252525252523252525
WY2323232323232322232323
VNHN66666666666
SG1919191919191917191919
ZAGT33333332333

545 rows × 11 columns

与MultiIndex结构类似

 

4、小结

  • groupby进行数据的分组
    • pandas中,抛开聚合谈分组,无意义

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐