Как получить вывод выпадающего виджета в виде кадра данных? - PullRequest
0 голосов
/ 08 июля 2019

Вот код для фильтрации кадра данных на основе поля и имени скважины с использованием двух раскрывающихся списков.Фильтр применяется к фрейму данных pandas, и я хочу, чтобы отфильтрованный вывод (common_filter) также был типом фрейма данных pandas.В настоящее время, когда имеет виджет типа.Есть ли способ получить его как dataframe?

Приведенный ниже код взят из TowardsDataScience и немного изменен.

Функция "unique_sorted_values" просто возвращает список уникальных отсортированных значений переданного массива,в этом случае FieldID и WellnameID

import ipywidgets as widgets

# dummy data
df = pd.DataFrame({'FieldID': ['A', 'A', 'A', 'B', 'B', 'B', 'B'],
                        'WellnameID':['1_A', '1_A', '2_A', '1_B', '1_B', '2_B', '2_B'],
                        'value': [1, 2, 3, 4, 5, 6, 7]})

output = widgets.Output()

dropdown_field = widgets.Dropdown(options = unique_sorted_values(df.FieldID))
dropdown_wellname = widgets.Dropdown(options = unique_sorted_values(df[df.FieldID==dropdown_field.value].WellnameID))

def common_filtering(field, wellname):
    output.clear_output()

    common_filter = df[(df.FieldID == field) & (df.WellnameID == wellname)]

    with output:
        display(common_filter)

def dropdown_field_eventhandler(change):
    common_filtering(change.new, dropdown_wellname.value)
def dropdown_wellname_eventhandler(change):
    common_filtering(dropdown_field.value, change.new)

dropdown_field.observe(dropdown_field_eventhandler, names='value')
dropdown_wellname.observe(dropdown_wellname_eventhandler, names='value')

input_widgets = widgets.HBox([dropdown_field, dropdown_wellname])
display(input_widgets)

display(output)

1 Ответ

0 голосов
/ 09 июля 2019

Нельзя использовать значение return функции для фрейма данных, поскольку возвращаемое значение не присваивается чему-либо в основной части кода (оно передается взаимодействию как обратный вызов).Поскольку вы хотите создать совершенно новый фрейм данных (а не модифицировать существующий), простым способом будет использование ключевого слова global в скопированной версии исходных данных.

После выбора раскрывающихся списков,Вы должны быть в состоянии получить filtered фрейм данных в ячейке ниже и увидеть влияние фильтров.Если вам нужно что-то более сложное, вы, вероятно, захотите создать объект class для отслеживания состояния данных, применения фильтров и т. Д.

    import ipywidgets as widgets
    import pandas as pd

    # dummy data
    df = pd.DataFrame({'FieldID': ['A', 'A', 'A', 'B', 'B', 'B', 'B'],
                            'WellnameID':['1_A', '1_A', '2_A', '1_B', '1_B', '2_B', '2_B'],
                            'value': [1, 2, 3, 4, 5, 6, 7]})

    filtered = pd.DataFrame()
    output = widgets.Output()

    dropdown_field = widgets.Dropdown(options = sorted(df.FieldID.unique()))
    dropdown_wellname = widgets.Dropdown(options = sorted(df[df.FieldID==dropdown_field.value].WellnameID.unique()))

    def common_filtering(field, wellname):
        global filtered
        output.clear_output()

        filtered = df[(df.FieldID == field) & (df.WellnameID == wellname)]

        with output:
            display(filtered)

    def dropdown_field_eventhandler(change):
        common_filtering(change.new, dropdown_wellname.value)
    def dropdown_wellname_eventhandler(change):
        common_filtering(dropdown_field.value, change.new)

    dropdown_field.observe(dropdown_field_eventhandler, names='value')
    dropdown_wellname.observe(dropdown_wellname_eventhandler, names='value')

    input_widgets = widgets.HBox([dropdown_field, dropdown_wellname])
    display(input_widgets)

    display(output)
...