【基本工具】S02E15 GroupBy使用方法(上篇):实现分割、应用和组合

0.本集概览

1.GroupBy的使用场景和使用方法
2.GroupBy分割、应用和组合的操作内涵
3.GroupBy对象的遍历

1.GroupBy的使用场景和使用方法

今天这一集我们开始介绍Pandas中对数据进行处理的一个高逼格的方法:GroupBy。我举一个使用场景,科学家用不同的测量方法,测出了行星的质量、距离、轨道周期等等,就如同下面的代码所示:
代码片段:

import seaborn as sns
planets = sns.load_dataset('planets')
print(planets.head())

运行结果:

            method  number  orbital_period   mass  distance  year
0  Radial Velocity       1         269.300   7.10     77.40  2006
1  Radial Velocity       1         874.774   2.21     56.95  2008
2  Radial Velocity       1         763.000   2.60     19.84  2011
3  Radial Velocity       1         326.030  19.40    110.62  2007
4  Radial Velocity       1         516.220  10.50    119.47  2009

注意一下,这里的seaborn库是一个新的第三方库,我们用它来获取数据,我们在命令行下用pip3 install seaborn就能实现自动安装。

现在我问大家,如果我要你对使用相同method测出来的distance进行求平均值,你要怎么求?

额,莫不是就要用到你说的GroupBy?对,我们来做个示范:
代码片段:

import seaborn as sns
planets = sns.load_dataset('planets')
print(planets.groupby('method'))

运行结果:

<pandas.core.groupby.DataFrameGroupBy object at 0x00000000021DC3C8>

从结果中我们可以看出,我们试图以method数据列中不同的方法作为分组的依据,返回的是一个DataFrameGroupBy对象,本质上可以理解为就是一个特殊的DataFrame对象。但是请注意,这个变量是没办法直接打印出来的,只是一个中间状态量。

包括我们还可以利用DataFrame获取列的方法对其进行操作:
代码片段:

import seaborn as sns
planets = sns.load_dataset('planets')
print(planets.groupby('method')['orbital_period'])

运行结果:

<pandas.core.groupby.SeriesGroupBy object at 0x000000000CF3E550>

可以类比的是,他得到了一个SeriesGroupBy对象,也是一个中间变量。

回到前面提的问题,获取了分组,如果我们想在此基础上求各个不同方法测得的distance的平均值,就非常简单了。
代码片段:

import seaborn as sns
planets = sns.load_dataset('planets')
print(planets.groupby('method')['distance'].mean())

运行结果:

method
Astrometry                         17.875000
Eclipse Timing Variations         315.360000
Imaging                            67.715937
Microlensing                     4144.000000
Orbital Brightness Modulation    1180.000000
Pulsar Timing                    1200.000000
Pulsation Timing Variations              NaN
Radial Velocity                    51.600208
Transit                           599.298080
Transit Timing Variations        1104.333333
Name: distance, dtype: float64

2.Group的操作内涵:分割、应用和组合

从这个计算的结果中,我们可以更直观的理解题目中“GroupBy,分割、应用和组合”这句话的含义:

(1)首先对原始的DataFrame对象进行按组分割,得到一个中间变量DataFrameGroupBy

(2)每一个组包含了指定method的一组distance值,然后对这些组分别应用mean方法求平均值;

(3)最后把各组对应的平均值进行组合,形成最后的一个Series完整结果。

这里可以使用的方法很广,包含了一般的统计方法:求和、求均值、求中位数、方差、累和、最值等常用方法。

自然,describe方法也是可以在此使用的。
代码片段:

import seaborn as sns
planets = sns.load_dataset('planets')
print(planets.groupby('method')['year'].describe())

运行结果:
```
method
Astrometry count 2.000000
mean 2011.500000
std 2.121320
min 2010.000000
25% 2010.750000
50% 2011.500000
75% 2012.250000
max 2013.000000
Eclipse Timing Variations count 9.000000
mean 2010.000000
std 1.414214
min 2008.000000
25% 2009.000000
50% 2010.000000
75% 2011.000000
max 2012.000000

top Created with Sketch.