表格入门

[In ]:
from datascience import *
path_data = '../../../assets/data/'
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plots
plots.style.use('fivethirtyeight')

cones = Table.read_table(path_data + 'cones.csv')
nba = Table.read_table(path_data + 'nba_salaries.csv').relabeled(3, 'SALARY')
movies = Table.read_table(path_data + 'movies_by_year.csv')

现在我们可以应用 Python 来分析数据了。我们将使用存储在 Table 结构中的数据。

表格是表示数据集的基本方式。一个表格可以从两个角度来理解: * 一系列已命名的列,每一列描述数据集中所有条目的单个属性;或 * 一系列行,每一行包含数据集中单个个体的所有信息。

我们将在接下来的几章中详细研究表格。现在,我们只介绍几个方法,不涉及技术细节。

cones 表已经为我们导入;稍后我们将会看到如何导入,但现在我们先直接使用它。首先,让我们来看一下这个表。

[In ]:
cones
Flavor     | Color       | Price
strawberry | pink        | 3.55
chocolate  | light brown | 4.75
chocolate  | dark brown  | 5.25
strawberry | pink        | 5.25
chocolate  | dark brown  | 5.25
bubblegum  | pink        | 4.75

该表有六行。每一行对应一个冰淇淋蛋筒。冰淇淋蛋筒就是个体

每个蛋筒有三个属性:口味(flavor)、颜色(color)和价格(price)。每一列包含其中一个属性的数据,因此任何单个列中的所有条目都属于同一类型。每一列都有一个标签。我们将通过标签来引用列。

表格方法就像函数一样,但它必须操作在表格上。因此调用形式为

name_of_table.method(arguments)

例如,如果你只想查看表格的前两行,可以使用表格方法 show

[In ]:
cones.show(2)
<IPython.core.display.HTML object>

你可以将 2 替换为任意行数。如果请求超过六行,你只会得到六行,因为 cones 只有六行。

选择列集合

select 方法创建一个仅包含指定列的新表。

[In ]:
cones.select('Flavor')
Flavor
strawberry
chocolate
chocolate
strawberry
chocolate
bubblegum

这不会改变原始表。

[In ]:
cones
Flavor     | Color       | Price
strawberry | pink        | 3.55
chocolate  | light brown | 4.75
chocolate  | dark brown  | 5.25
strawberry | pink        | 5.25
chocolate  | dark brown  | 5.25
bubblegum  | pink        | 4.75

可以通过逗号分隔列标签来选择多个列。

[In ]:
cones.select('Flavor', 'Price')
Flavor     | Price
strawberry | 3.55
chocolate  | 4.75
chocolate  | 5.25
strawberry | 5.25
chocolate  | 5.25
bubblegum  | 4.75

你也可以删除不需要的列。上面的表可以通过删除 Color 列来创建。

[In ]:
cones.drop('Color')
Flavor     | Price
strawberry | 3.55
chocolate  | 4.75
chocolate  | 5.25
strawberry | 5.25
chocolate  | 5.25
bubblegum  | 4.75

你可以命名这个新表,然后只需输入其名称即可再次查看。

[In ]:
no_colors = cones.drop('Color')

no_colors
Flavor     | Price
strawberry | 3.55
chocolate  | 4.75
chocolate  | 5.25
strawberry | 5.25
chocolate  | 5.25
bubblegum  | 4.75

select 类似,drop 方法创建一个较小的表,并保持原始表不变。为了探索数据,你可以通过选择或删除列来创建任意数量的小表。这不会对原始数据表造成任何损害。

行排序

sort 方法通过按指定列中值的升序排列原始表的行来创建一个新表。这里,cones 表已按蛋筒价格的升序排序。

[In ]:
cones.sort('Price')
Flavor     | Color       | Price
strawberry | pink        | 3.55
chocolate  | light brown | 4.75
bubblegum  | pink        | 4.75
chocolate  | dark brown  | 5.25
strawberry | pink        | 5.25
chocolate  | dark brown  | 5.25

要按降序排序,可以使用 sort可选参数。顾名思义,可选参数不是必须使用的,但如果想要改变方法的默认行为,可以使用它们。

默认情况下,sort 按指定列中值的递增顺序排序。要按递减顺序排序,请使用可选参数 descending=True

[In ]:
cones.sort('Price', descending=True)
Flavor     | Color       | Price
chocolate  | dark brown  | 5.25
strawberry | pink        | 5.25
chocolate  | dark brown  | 5.25
bubblegum  | pink        | 4.75
chocolate  | light brown | 4.75
strawberry | pink        | 3.55

selectdrop 一样,sort 方法保持原始表不变。

选择满足条件的行

where 方法创建一个仅包含满足给定条件的行的新表。在本节中,我们将使用一个非常简单的条件:指定列中的值必须等于我们指定的值。因此,where 方法有两个参数。

下面单元格中的代码创建了一个仅包含巧克力蛋筒对应行的表。

[In ]:
cones.where('Flavor', 'chocolate')
Flavor    | Color       | Price
chocolate | light brown | 4.75
chocolate | dark brown  | 5.25
chocolate | dark brown  | 5.25

参数(以逗号分隔)是列的标签和我们在该列中寻找的值。当行必须满足的条件更复杂时,也可以使用 where 方法。在这些情况下,调用也会稍微复杂一些。

提供精确的值很重要。例如,如果我们指定 Chocolate 而不是 chocolate,那么 where 会正确地找不到口味为 Chocolate 的行。

[In ]:
cones.where('Flavor', 'Chocolate')
Flavor | Color | Price

与本节中的所有其他表格方法一样,where 保持原始表不变。

示例:NBA 薪资

CNN 在 2016 年 3 月报道称:“NBA 是世界上收入最高的职业体育联盟。” nba 表包含了 2015-2016 赛季所有美国国家篮球协会球员的薪资

每一行代表一名球员。列如下:

列标签 描述
PLAYER 球员姓名
POSITION 球员在球队中的位置
TEAM 球队名称
SALARY 球员 2015-2016 赛季薪资,单位百万美元

位置的代码如下:PG(控球后卫)、SG(得分后卫)、PF(大前锋)、SF(小前锋)和 C(中锋)。但接下来的内容不涉及篮球比赛的具体细节。

第一行显示,亚特兰大老鹰队的大前锋 Paul Millsap 在 2015-2016 赛季的薪资接近约 1870 万美元。

[In ]:
nba
PLAYER           | POSITION | TEAM          | SALARY
Paul Millsap     | PF       | Atlanta Hawks | 18.6717
Al Horford       | C        | Atlanta Hawks | 12
Tiago Splitter   | C        | Atlanta Hawks | 9.75625
Jeff Teague      | PG       | Atlanta Hawks | 8
Kyle Korver      | SG       | Atlanta Hawks | 5.74648
Thabo Sefolosha  | SF       | Atlanta Hawks | 4
Mike Scott       | PF       | Atlanta Hawks | 3.33333
Kent Bazemore    | SF       | Atlanta Hawks | 2
Dennis Schroder  | PG       | Atlanta Hawks | 1.7634
Tim Hardaway Jr. | SG       | Atlanta Hawks | 1.30452
... (407 rows omitted)

Stephen Curry 的球迷可以使用 where 找到他的那一行。

[In ]:
nba.where('PLAYER', 'Stephen Curry')
PLAYER        | POSITION | TEAM                  | SALARY
Stephen Curry | PG       | Golden State Warriors | 11.3708

我们还可以创建一个名为 warriors 的新表,只包含金州勇士队的数据。

[In ]:
warriors = nba.where('TEAM', 'Golden State Warriors')
warriors
PLAYER            | POSITION | TEAM                  | SALARY
Klay Thompson     | SG       | Golden State Warriors | 15.501
Draymond Green    | PF       | Golden State Warriors | 14.2609
Andrew Bogut      | C        | Golden State Warriors | 13.8
Andre Iguodala    | SF       | Golden State Warriors | 11.7105
Stephen Curry     | PG       | Golden State Warriors | 11.3708
Jason Thompson    | PF       | Golden State Warriors | 7.00847
Shaun Livingston  | PG       | Golden State Warriors | 5.54373
Harrison Barnes   | SF       | Golden State Warriors | 3.8734
Marreese Speights | C        | Golden State Warriors | 3.815
Leandro Barbosa   | SG       | Golden State Warriors | 2.5
... (4 rows omitted)

默认情况下,会显示表的前 10 行。你可以使用 show 来显示更多或更少的行。要显示整个表,使用不带参数的 show

[In ]:
warriors.show()
<IPython.core.display.HTML object>

nba 表按球队名称的字母顺序排序。要了解球员在 2015-2016 赛季的薪资情况,按薪资对数据进行排序会很有帮助。记住,默认是按递增顺序排序。

[In ]:
nba.sort('SALARY')
PLAYER                 | POSITION | TEAM                 | SALARY
Thanasis Antetokounmpo | SF       | New York Knicks      | 0.030888
Jordan McRae           | SG       | Phoenix Suns         | 0.049709
Cory Jefferson         | PF       | Phoenix Suns         | 0.049709
Elliot Williams        | SG       | Memphis Grizzlies    | 0.055722
Orlando Johnson        | SG       | Phoenix Suns         | 0.055722
Phil Pressey           | PG       | Phoenix Suns         | 0.055722
Keith Appling          | PG       | Orlando Magic        | 0.061776
Sean Kilpatrick        | SG       | Denver Nuggets       | 0.099418
Erick Green            | PG       | Utah Jazz            | 0.099418
Jeff Ayres             | PF       | Los Angeles Clippers | 0.111444
... (407 rows omitted)

这些数字有些难以比较,因为部分球员在赛季中更换了球队,从多支球队领取了薪资;表中只显示了来自最后一支球队的薪资。

CNN 的报道关注的是薪资范围的另一端——世界上收入最高的球员。要找出这些球员,我们可以按薪资降序排序,并查看最上面的几行。

[In ]:
nba.sort('SALARY', descending=True)
PLAYER          | POSITION | TEAM                  | SALARY
Kobe Bryant     | SF       | Los Angeles Lakers    | 25
Joe Johnson     | SF       | Brooklyn Nets         | 24.8949
LeBron James    | SF       | Cleveland Cavaliers   | 22.9705
Carmelo Anthony | SF       | New York Knicks       | 22.875
Dwight Howard   | C        | Houston Rockets       | 22.3594
Chris Bosh      | PF       | Miami Heat            | 22.1927
Chris Paul      | PG       | Los Angeles Clippers  | 21.4687
Kevin Durant    | SF       | Oklahoma City Thunder | 20.1586
Derrick Rose    | PG       | Chicago Bulls         | 20.0931
Dwyane Wade     | SG       | Miami Heat            | 20
... (407 rows omitted)

已故的 Kobe Bryant 是 2015-2016 赛季收入最高的 NBA 球员。

[In ]: