连接聚合#
Join Aggregate 转换几乎在所有方面都与 Aggregate 转换相同,但其结果聚合会连接到原始数据集。为了更清楚地说明这一点,考虑以下数据集
import pandas as pd
import numpy as np
rand = np.random.RandomState(0)
df = pd.DataFrame({
'label': rand.choice(['A', 'B', 'C'], 10),
'value': rand.randn(10),
})
df
label value
0 A -0.173070
1 B -1.761652
2 A -0.087673
3 B 1.366879
4 B 1.125314
5 C -0.358996
6 A 1.220608
7 C -1.339496
8 A 0.428373
9 A -0.123463
这是一个等同于 Altair 的 Aggregate 转换的 pandas 操作,以均值为例
mean = df.groupby('label').mean().reset_index()
mean
label value
0 A 0.252955
1 B 0.243514
2 C -0.849246
这里是等同于 Altair 的 Join Aggregate 的输出
pd.merge(df, mean, on='label', suffixes=['', '_mean'])
label value value_mean
0 A -0.173070 0.252955
1 B -1.761652 0.243514
2 A -0.087673 0.252955
3 B 1.366879 0.243514
4 B 1.125314 0.243514
5 C -0.358996 -0.849246
6 A 1.220608 0.252955
7 C -1.339496 -0.849246
8 A 0.428373 0.252955
9 A -0.123463 0.252955
注意,连接聚合会将聚合值与原始数据框连接起来,以便在需要时可以将聚合值与原始值结合使用。
这是一个展示如何使用连接聚合的示例:我们比较 IMDB 和 Rotten Tomatoes 的电影评分,并按其平均值和标准差进行归一化,这需要对连接后的数据进行计算
import altair as alt
from vega_datasets import data
alt.Chart(data.movies.url).transform_filter(
'datum.IMDB_Rating != null && datum.Rotten_Tomatoes_Rating != null'
).transform_joinaggregate(
IMDB_mean='mean(IMDB_Rating)',
IMDB_std='stdev(IMDB_Rating)',
RT_mean='mean(Rotten_Tomatoes_Rating)',
RT_std='stdev(Rotten_Tomatoes_Rating)'
).transform_calculate(
IMDB_Deviation="(datum.IMDB_Rating - datum.IMDB_mean) / datum.IMDB_std",
Rotten_Tomatoes_Deviation="(datum.Rotten_Tomatoes_Rating - datum.RT_mean) / datum.RT_std"
).mark_point().encode(
x='IMDB_Deviation:Q',
y="Rotten_Tomatoes_Deviation:Q"
)
转换选项#
transform_joinaggregate()
方法构建在 JoinAggregateTransform
类之上,该类具有以下选项