按列连接表格

通常,关于同一个个体的数据保存在多个表格中。例如,大学的一个办公室可能有每个学生完成学位所需时间的数据,而另一个办公室可能有学生的学费和助学金数据。

为了理解学生的经历,将这两个数据集放在一起可能会有所帮助。如果数据在两个表中,每个表每个学生一行,那么我们想要将列放在一起,确保行匹配,以便每个学生的信息保留在单一行中。

让我们在一个简单示例的上下文中这样做,然后在一个更大的数据集上使用该方法。

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

cones 是之前遇到过的一个表。现在假设每种口味的冰淇淋都有一个评分,这个评分保存在另一个表中。

[In ]:
cones = Table().with_columns(
    'Flavor', make_array('strawberry', 'vanilla', 'chocolate', 'strawberry', 'chocolate'),
    'Price', make_array(3.55, 4.75, 6.55, 5.25, 5.75)
)
cones
Flavor     | Price
strawberry | 3.55
vanilla    | 4.75
chocolate  | 6.55
strawberry | 5.25
chocolate  | 5.75
[In ]:
ratings = Table().with_columns(
    'Kind', make_array('strawberry', 'chocolate', 'vanilla'),
    'Stars', make_array(2.5, 3.5, 4)
)
ratings
Kind       | Stars
strawberry | 2.5
chocolate  | 3.5
vanilla    | 4

每个表都有一个包含冰淇淋口味的列:conesFlavor 列,ratingsKind 列。这些列中的条目可用于链接两个表。

方法 join 创建一个新表,其中 cones 表中的每个蛋筒都补充了 ratings 表中的 Stars 信息。对于 cones 中的每个蛋筒,joinratings 中找到一行,其 Kind 与该蛋筒的 Flavor 匹配。我们必须告诉 join 使用这些列进行匹配。

[In ]:
rated = cones.join('Flavor', ratings, 'Kind')
rated
Flavor     | Price | Stars
chocolate  | 6.55  | 3.5
chocolate  | 5.75  | 3.5
strawberry | 3.55  | 2.5
strawberry | 5.25  | 2.5
vanilla    | 4.75  | 4

现在每个蛋筒不仅有其价格,还有其口味的评分。

一般来说,使用来自另一个表(比如 table2)的信息扩充一个表(比如 table1)的 join 调用如下所示:

table1.join(table1_column_for_joining, table2, table2_column_for_joining)

新表 rated 允许我们计算每颗星的价格,你可以将其视为一种非正式的价值衡量指标。值低是好的——这意味着你为每颗评分星支付的费用更少。

[In ]:
rated.with_column('$/Star', rated.column('Price') / rated.column('Stars')).sort(3)
Flavor     | Price | Stars | $/Star
vanilla    | 4.75  | 4     | 1.1875
strawberry | 3.55  | 2.5   | 1.42
chocolate  | 5.75  | 3.5   | 1.64286
chocolate  | 6.55  | 3.5   | 1.87143
strawberry | 5.25  | 2.5   | 2.1

虽然草莓是三种口味中评分最低的,但价格更便宜的草莓蛋筒在这个指标上表现不错,因为每颗星的费用并不高。

附注。 我们列出两个表的顺序有影响吗?让我们试试。如你所见,这改变了列出现的顺序,并可能改变行的顺序,但这不会产生任何根本性差异。

[In ]:
ratings.join('Kind', cones, 'Flavor')
Kind       | Stars | Price
chocolate  | 3.5   | 6.55
chocolate  | 3.5   | 5.75
strawberry | 2.5   | 3.55
strawberry | 2.5   | 5.25
vanilla    | 4     | 4.75

另请注意,连接只会包含同时出现在两个表中的项目的信息。让我们看一个例子。假设有一个关于某些冰淇淋蛋筒的评价表,并且我们已经找到了每种口味的平均评价。

[In ]:
reviews = Table().with_columns(
    'Flavor', make_array('vanilla', 'chocolate', 'vanilla', 'chocolate'),
    'Stars', make_array(5, 3, 5, 4)
)
reviews
Flavor    | Stars
vanilla   | 5
chocolate | 3
vanilla   | 5
chocolate | 4
[In ]:
average_review = reviews.group('Flavor', np.average)
average_review
Flavor    | Stars average
chocolate | 3.5
vanilla   | 5

我们可以通过提供用于连接的列标签来连接 conesaverage_review

[In ]:
cones.join('Flavor', average_review, 'Flavor')
Flavor    | Price | Stars average
chocolate | 6.55  | 3.5
chocolate | 5.75  | 3.5
vanilla   | 4.75  | 5

注意草莓蛋筒消失了。没有评价是针对草莓蛋筒的,因此 strawberry 行没有可以连接的内容。这可能是问题,也可能不是——这取决于我们试图用连接后的表进行的分析。