我在jupyter笔记本电脑中处理了一个数据集,我希望能够将数据作为ipywidgets输出中返回的数据帧访问。
我已经考虑过几个选项,但我一辈子都无法找到如何访问过滤后的结果。
这是设置过滤器和列表框的代码。带所有代码的完整笔记本在这里
import pandas as pd
import numpy as np
import ipywidgets as widgets
from ipywidgets import Layout, AppLayout
from IPython.display import display
import functools
data = {'year': ['2000', '2000','2000','2000','2001','2001','2001','2001', '2002', '2002', '2002', '2002',
'2003','2003','2003','2003','2004', '2004','2004','2004', '2005', '2005', '2005', '2005',
'2006', '2006', '2006', '2006', '2006', '2007', '2007', '2007', '2007', '2008', '2008', '2008', '2008',
'2009', '2009', '2009', '2009'],
'purpose':['Holiday', 'Business', 'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study', 'Holiday', 'Business',
'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study', 'Holiday',
'Business', 'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study',
'Holiday', 'Business', 'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study', 'Holiday'
],
'market':['Belgium', 'Luxembourg', 'France', 'Spain', 'Norway', 'Sweden', 'Germany', 'Austria', 'Denmark',
'Portugal', 'Greece', 'Croatia', 'Belgium', 'Luxembourg', 'France', 'Spain', 'Norway', 'Sweden',
'Germany', 'Austria', 'Denmark', 'Portugal', 'Greece', 'Croatia', 'Belgium', 'Luxembourg', 'France',
'Spain', 'Norway', 'Sweden', 'Germany', 'Austria', 'Denmark', 'Portugal', 'Greece', 'Croatia', 'Belgium',
'Luxembourg', 'France', 'Spain', 'Norway'
]}
df_london = pd.DataFrame (data, columns = ['year','purpose', 'market'])
# Get our unique values
ALL = 'ALL'
def unique_sorted_values_plus_ALL(array):
unique = array.unique().tolist()
unique.sort()
unique.insert(0, ALL)
return unique
output = widgets.Output()
# Dropdown listbox
dropdown_year = widgets.Dropdown(description='Year',
options = unique_sorted_values_plus_ALL(df_london.year))
# Function to filter our dropdown listboxe
def common_filtering(year):
df = df_london.copy()
filters = []
# Evaluate our dropdown listbox and return booleans for our selections
if year is not ALL:
filters.append(df['year'] == year)
output.clear_output()
with output:
if filters:
df_filter = functools.reduce(lambda x,y: x&y, filters)
display(df.loc[df_filter])
else:
display(df)
def dropdown_year_eventhandler(change):
common_filtering(change.new)
dropdown_year.observe(dropdown_year_eventhandler, names='value')
ui = widgets.HBox([dropdown_year])
display(ui, output)
我确信这是一个简单的问题,但我自己就是做不出来。
问候
Tom
observe
函数中的代码不能真正以可使用的方式返回值。或者,您可以设置一个global
变量,并将过滤后的数据帧分配给该全局变量。我在下面的例子中使用了output_dataframe
。
import pandas as pd
import numpy as np
import ipywidgets as widgets
from ipywidgets import Layout, AppLayout
from IPython.display import display
import functools
data = {'year': ['2000', '2000','2000','2000','2001','2001','2001','2001', '2002', '2002', '2002', '2002',
'2003','2003','2003','2003','2004', '2004','2004','2004', '2005', '2005', '2005', '2005',
'2006', '2006', '2006', '2006', '2006', '2007', '2007', '2007', '2007', '2008', '2008', '2008', '2008',
'2009', '2009', '2009', '2009'],
'purpose':['Holiday', 'Business', 'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study', 'Holiday', 'Business',
'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study', 'Holiday',
'Business', 'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study',
'Holiday', 'Business', 'VFR', 'Study', 'Holiday', 'Business', 'VFR', 'Study', 'Holiday'
],
'market':['Belgium', 'Luxembourg', 'France', 'Spain', 'Norway', 'Sweden', 'Germany', 'Austria', 'Denmark',
'Portugal', 'Greece', 'Croatia', 'Belgium', 'Luxembourg', 'France', 'Spain', 'Norway', 'Sweden',
'Germany', 'Austria', 'Denmark', 'Portugal', 'Greece', 'Croatia', 'Belgium', 'Luxembourg', 'France',
'Spain', 'Norway', 'Sweden', 'Germany', 'Austria', 'Denmark', 'Portugal', 'Greece', 'Croatia', 'Belgium',
'Luxembourg', 'France', 'Spain', 'Norway'
]}
df_london = pd.DataFrame (data, columns = ['year','purpose', 'market'])
output_dataframe = None
# Get our unique values
ALL = 'ALL'
def unique_sorted_values_plus_ALL(array):
unique = array.unique().tolist()
unique.sort()
unique.insert(0, ALL)
return unique
output = widgets.Output()
# Dropdown listbox
dropdown_year = widgets.Dropdown(description='Year',
options = unique_sorted_values_plus_ALL(df_london.year))
# Function to filter our dropdown listboxe
def common_filtering(year):
global output_dataframe
df = df_london.copy()
filters = []
# Evaluate our dropdown listbox and return booleans for our selections
if year is not ALL:
filters.append(df['year'] == year)
output.clear_output()
with output:
if filters:
df_filter = functools.reduce(lambda x,y: x&y, filters)
output_dataframe = df.loc[df_filter]
else:
output_dataframe = df
display(output_dataframe)
def dropdown_year_eventhandler(change):
common_filtering(change.new)
dropdown_year.observe(dropdown_year_eventhandler, names='value')
ui = widgets.HBox([dropdown_year])
display(ui, output)