From a1f3bc7130a7314a6002e49d4dbfe4486e48b892 Mon Sep 17 00:00:00 2001 From: Xiaojing Chen Date: Sun, 5 Mar 2023 07:41:44 +0800 Subject: [PATCH] Fix for column data is a list or tuple in pc.data_table (#576) --- pynecone/components/datadisplay/datatable.py | 2 +- pynecone/utils.py | 24 +++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/pynecone/components/datadisplay/datatable.py b/pynecone/components/datadisplay/datatable.py index 64c135d2c..c22ffd914 100644 --- a/pynecone/components/datadisplay/datatable.py +++ b/pynecone/components/datadisplay/datatable.py @@ -94,7 +94,7 @@ class DataTable(Gridjs): # If given a pandas df break up the data and columns if utils.is_dataframe(type(self.data)): self.columns = Var.create(list(self.data.columns.values.tolist())) # type: ignore - self.data = Var.create(list(self.data.values.tolist())) # type: ignore + self.data = Var.create(utils.format_dataframe_values(self.data)) # type: ignore # Render the table. return super()._render() diff --git a/pynecone/utils.py b/pynecone/utils.py index 0dd737fe1..a1240b961 100644 --- a/pynecone/utils.py +++ b/pynecone/utils.py @@ -1288,6 +1288,28 @@ def is_valid_var_type(var: Type) -> bool: return _issubclass(var, StateVar) or is_dataframe(var) or is_figure(var) +def format_dataframe_values(value: Type) -> List[Any]: + """Format dataframe values. + + Args: + value: The value to format. + + Returns: + Format data + """ + if not is_dataframe(type(value)): + return value + + format_data = [] + for data in list(value.values.tolist()): + element = [] + for d in data: + element.append(str(d) if isinstance(d, (list, tuple)) else d) + format_data.append(element) + + return format_data + + def format_state(value: Any) -> Dict: """Recursively format values in the given state. @@ -1316,7 +1338,7 @@ def format_state(value: Any) -> Dict: if is_dataframe(type(value)): return { "columns": value.columns.tolist(), - "data": value.values.tolist(), + "data": format_dataframe_values(value), } raise TypeError(