表格入门
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 表已经为我们导入;稍后我们将会看到如何导入,但现在我们先直接使用它。首先,让我们来看一下这个表。
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。
cones.show(2)
<IPython.core.display.HTML object>你可以将 2 替换为任意行数。如果请求超过六行,你只会得到六行,因为 cones 只有六行。
选择列集合
select 方法创建一个仅包含指定列的新表。
cones.select('Flavor')
Flavor
strawberry
chocolate
chocolate
strawberry
chocolate
bubblegum这不会改变原始表。
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可以通过逗号分隔列标签来选择多个列。
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 列来创建。
cones.drop('Color')
Flavor | Price
strawberry | 3.55
chocolate | 4.75
chocolate | 5.25
strawberry | 5.25
chocolate | 5.25
bubblegum | 4.75你可以命名这个新表,然后只需输入其名称即可再次查看。
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 表已按蛋筒价格的升序排序。
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。
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与 select 和 drop 一样,sort 方法保持原始表不变。
选择满足条件的行
where 方法创建一个仅包含满足给定条件的行的新表。在本节中,我们将使用一个非常简单的条件:指定列中的值必须等于我们指定的值。因此,where 方法有两个参数。
下面单元格中的代码创建了一个仅包含巧克力蛋筒对应行的表。
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 的行。
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 万美元。
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 找到他的那一行。
nba.where('PLAYER', 'Stephen Curry')
PLAYER | POSITION | TEAM | SALARY
Stephen Curry | PG | Golden State Warriors | 11.3708我们还可以创建一个名为 warriors 的新表,只包含金州勇士队的数据。
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。
warriors.show()
<IPython.core.display.HTML object>nba 表按球队名称的字母顺序排序。要了解球员在 2015-2016 赛季的薪资情况,按薪资对数据进行排序会很有帮助。记住,默认是按递增顺序排序。
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 的报道关注的是薪资范围的另一端——世界上收入最高的球员。要找出这些球员,我们可以按薪资降序排序,并查看最上面的几行。
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 球员。