首页 > 技术文章 > pandas中的分组和聚类计算

KnightLaHire 2021-07-18 22:43 原文

对于查看完数据后通常会先统计一些基础数据,这是就会用到分组和聚类计算

例如读取Gapminder中的一组数据后,我们可能会存在如下问题:

1)数据中每年平均预期寿命是多少,平均预期寿命、人口和GDP是多少?

2)如果按洲对数据分层,并进行同样的计算,结果会怎样?

3)每个洲列出了多少个国家和地区?

 

 那么先来解决第一个问题?

如何使用pandas计算一组数据的平均值,首先需要对数据进行分组,可以使用pandas.groupby('列名')根据某一列元素进行分组,然后选择分组后的哪一列值pandas.groupby()[‘列名’],可以对分好的组求均值。

# 数据中每年的平均预期寿命是多少?
# 为了回答这个问题,需要先对数据按照年份进行分裂,然后获取lifeExp列,计算平均值。
df.groupby('year')['lifeExp'].mean()

Out:

 

接下来对寿命和GDP做一系列类似的计算,如果下:

df.groupby(['year','continent'])[['lifeExp','gdpPercap']].mean()

Out:

 

 

 上面输出的数据按照年份和洲进行了分组。针对每个‘年份-洲’对,计算相应的平均预期寿命和平均GDP。但是输出的数据有一些奇怪,请注意,年份和洲的‘列名’与预期寿命和GDP的‘列名’不在同一行。年份和洲的行索引之间存在某种层级结构。

如果想要平铺dataframe,可以使用reset_index方法。

df.groupby(['year','continent'])[['lifeExp','gdpPercap']].mean().reset_index()

 

Out:

 

 

 下面来解决第二个问题——分组频数计数

数据相关的另一个任务是计算频率。可以使用nunique方法或value_counts方法来获取Pandas Series的唯一值和频数计算。

# 使用nunique()方法计算Series中唯一值的数目
df.groupby('continent')['country'].nunique()

 

Out: 

df.groupby('continent')['country'].value_counts()

Out:

 

 

 可以发现nunique方法或value_counts方法的返回值并不相同,而nunique返回的是唯一值,而value_counts返回的是不做唯一化区分的频数。

 

推荐阅读