For those interested, solved using the response to this post.
Initializing the state is definitely required for messing around with dfs, it would seem.
import pandas as pd
import panel as pn
import param
from panel.viewable import Viewer
data = pd.DataFrame({'first_subset': ['sample1', 'sample1', 'sample1', 'sample2', 'sample2', 'sample2'],
'slider_col': [1,2,3,4,5,6],
'other': [1,2,3,4,5,6],
'other1': [1,2,3,4,5,6]})
options = list(data.first_subset.unique())
# class do_the_things(param.Parameterized):
class do_the_things(Viewer):
update_output_button = pn.widgets.Button(name='Approve Subset',button_type='primary')
# set up parameters. those with the suffix _pass are set up in order to be updated in the first callback below.
input_data = param.DataFrame(default=data,precedence=-1)
output_data = param.DataFrame(default=data)#,precedence=-1)
slider_to_filter_subset1 = param.Integer(default=33,bounds=(0,100))
slider_to_filter_subset2 = param.Integer(default=55,bounds=(0,100))
subset_data_by_selection = param.Selector(objects=options)
update_output_button = param.Action(lambda x: x.add_output_data(),label='Approve Interval')
# add = param.Action(lambda x:x.add_datapoint())
def __init__(self,**params):
super().__init__(**params)
self.output_data_widget = pn.Param(self.param.output_data)
self.input_data_widget = pn.Param(self.param.input_data)
self._layout = pn.Column(
pn.Param(self,parameters=['slider_to_filter_subset1','slider_to_filter_subset2','subset_data_by_selection',
'update_output_button']),
self.output_data_widget,
self.input_data_widget
#self.update_params_with_selected_row_values
)
@pn.depends('output_data',watch=True)
def _update_output_widget(self):
self.output_data_widget.value = self.output_data
self.output_data_widget.height = 5# int(min(len(self.output_data)/6,1)*6*self.output_data_widget.row_height) + self.output_data_widget.row_height
def __panel__(self):
return self._layout
def add_output_data(self, event=None):
data_tosend = self.input_data[self.input_data['first_subset'] == self.subset_data_by_selection]
data_tosend = data_tosend[(data_tosend.slider_col >= self.slider_to_filter_subset1) & (data_tosend.slider_col < self.slider_to_filter_subset2)]
if self.output_data is None:
self.output_data = data_tosend
else:
self.output_data = self.output_data.append(data_tosend,ignore_index=True)
do_things = do_the_things()
pn.extension()
app = pn.Row(do_things.param)
app