Постройте одну часть DataFrame независимо от фильтра - PullRequest
1 голос
/ 29 апреля 2020

Я хотел бы построить часть моего фрейма данных в зависимости от значения ползунка (т. Е. Ползунок фильтрует строки, которые имеют совпадающее значение в определенном столбце). В некоторых строках отсутствует значение в столбце, который используется для фильтрации. Я хотел бы, чтобы эти строки всегда отображались на графике - независимо от ползунка.

Вот код для пояснения. Столбец, используемый для фильтрации, в этом примере называется parameter.

In [1]:  import altair as alt
         import pandas as pd

In [2]:  df_with_parameter_col = pd.DataFrame(
             {
                 "x": [1, 1],
                 "y": [2, 3],
                 "parameter": [2, 3]
             }
         )

         df_without_parameter_col = pd.DataFrame(
             {
                 "x": [1],
                 "y": [1]
             }
         )

In [3]:  df = pd.concat([df_with_parameter_col,
                         df_without_parameter_col])
         df
Out [3]:        x   y   parameter
            0   1   2   2.0
            1   1   3   3.0
            0   1   1   NaN

In [4]:  slider_parameter = alt.binding_range(min=2, max=3, step=1, name="Parameter ")

         select_parameter = alt.selection_single(
             fields=["parameter"],
             bind={"parameter": slider_parameter},
             init={"parameter": 2},
             name="Slider"
         )

         chart = alt.Chart(df).mark_point().encode(
             y="y",
             x="x",
         ).add_selection(
             select_parameter
         ).transform_filter(
             select_parameter
         )

Данные в строке с отсутствующим значением в столбце parameter никогда не отображаются. Одним из способов решения этой проблемы является дублирование этой строки для каждого возможного значения ползунка и изменение значения NaN на значение, которое может соответствовать значению ползунка. Однако это было бы очень расточительно с точки зрения памяти. Есть ли лучшее решение?

1 Ответ

2 голосов
/ 29 апреля 2020

Вы можете сделать это с немного более сложным оператором фильтра, используя выражение vega синтаксис:

slider_parameter = alt.binding_range(min=2, max=3, step=1, name="Parameter ")

select_parameter = alt.selection_single(
    fields=["parameter"],
    bind={"parameter": slider_parameter},
    init={"parameter": 2},
    name="Slider"  # Note: if this is changed, change the name below as well.
)

alt.Chart(df).mark_point().encode(
    y="y",
    x="x",
).add_selection(
    select_parameter
).transform_filter(
    # Note: "Slider" here matches the `name` specified for the selection.
    # Its attributes are drawn from the `fields` specified for the selection.
    "!isValid(datum.parameter) || (datum.parameter == Slider.parameter)"
)

enter image description here

...