[英]How to return a pandas dataframe from an ipywidgets output
我有一個正在 jupyter 筆記本中處理的數據集,我希望能夠以 dataframe 的形式訪問數據,該數據在 ipywidgets output 中返回。
我玩過幾個選項,但我一生都無法弄清楚如何訪問過濾后的結果。
這是設置過濾器和列表框的代碼。 包含所有代碼的完整筆記本在這里
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)
我確定它是一個簡單的,但我自己無法解決。
問候
湯姆
您observe
的 function 中的代碼實際上無法以您可以使用的方式返回值。 或者,您可以設置一個global
變量,並將過濾后的 dataframe 分配給該全局變量。 我在下面的示例中使用了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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.