连接聚合#

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 类之上,该类具有以下选项

点击显示表格

属性

类型

描述

groupby

数组(FieldName)

用于将数据对象分区到不同组的数据字段。如果未指定,所有数据点将位于单个组中。

joinaggregate

数组(JoinAggregateFieldDef)

连接聚合中字段的定义,以及要使用的计算方法。