对于查看完数据后通常会先统计一些基础数据,这是就会用到分组和聚类计算
例如读取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返回的是不做唯一化区分的频数。