Фильтрация данных с использованием выпадающего меню со строками в python - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть df, состоящий из восьми столбцов. Меня интересуют два из них: «Идентификатор» и «Описание». «Id» содержит числовое значение, в то время как «Description» содержит строковые значения (например, «высокая аварийная ситуация», «низкая аварийная ситуация», «зона 1»). Я хотел бы отфильтровать df с помощью выпадающего меню, содержащего выбранный список слов. Например, если в раскрывающемся меню выбраны слова «экстренный», результатом должен быть новый df, отфильтрованный только со строками, которые в столбце «Описание» содержат слово «аварийный».

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

Я сообщаю здесь код, который я написал до сих пор (df уже импортирован):

import ipywidgets
from bokeh.io import push_notebook
from bokeh.plotting import figure
from bokeh.io import output_notebook, show, reset_output
from bokeh.models import Range1d

output_notebook()

# drop-down widget
drop_down = ipywidgets.Dropdown(options=['emergency',
                                         'zone'],
                                description='Keyword:'
                               )
#data. I have problems here because I am passing alarm_count that is defined later in the function
x_bar_data_ipyw = alarm_count.IdAlarm.astype(str) 
y_bar_data_ipyw = alarm_count.Count

# figure and plot
bar_chart_interactive = figure(x_range=x_bar_data_ipyw, plot_height=300)
bar_ipyw = bar_chart_interactive.vbar(x_bar_data_ipyw, top=y_bar_data_ipyw, color='green', width=0.5)
bar_chart_interactive.y_range=Range1d(0, 18)

# function - bar chart
def filter(word):
        if word == 'emergency': 
            alarm_count = []
            alarm_count = df[df.Description.str.contains(word)].IdAlarm.value_counts().reset_index()
            alarm_count.columns = ['IdAlarm','Count']
            #alarm_count.sort_values(by = "Count", ascending = False)

        elif word == 'zone': 
            alarm_count = df[df.Description.str.contains(word)].IdAlarm.value_counts().reset_index()
            alarm_count.columns = ['IdAlarm','Count']
            #alarm_count.sort_values(by = "Count", ascending = False)



        push_notebook()


show(bar_chart_interactive, notebook_handle=True)

# interaction
ipywidgets.interact(filter, word=drop_down)

На данный момент я не могу построить отфильтрованный график и, следовательно, я не могу возможность обновления построенного графика. Любое предложение?

РЕДАКТИРОВАТЬ:

Образец моей DF:

Образец DF

...