From c076e42c15504bf5ca875feda2c7d9cc5dca29b9 Mon Sep 17 00:00:00 2001 From: HowToSD Date: Thu, 20 Feb 2025 01:55:21 -0800 Subject: [PATCH] Added Pandas Series To DataFrame and Pandas Transpose nodes. --- __init__.py | 6 +++ docs/reference/node_reference.md | 2 + docs/reference/pandas_rename.md | 2 +- docs/reference/pandas_series_to_dataframe.md | 19 ++++++++ docs/reference/pandas_transpose.md | 17 +++++++ modules/pandas_wrapper/pandas_rename.py | 2 +- .../pandas_series_to_dataframe.py | 46 +++++++++++++++++++ modules/pandas_wrapper/pandas_transpose.py | 39 ++++++++++++++++ pyproject.toml | 2 +- 9 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 docs/reference/pandas_series_to_dataframe.md create mode 100644 docs/reference/pandas_transpose.md create mode 100644 modules/pandas_wrapper/pandas_series_to_dataframe.py create mode 100644 modules/pandas_wrapper/pandas_transpose.py diff --git a/__init__.py b/__init__.py index ca1030b..a144df1 100644 --- a/__init__.py +++ b/__init__.py @@ -59,6 +59,7 @@ from .modules.pandas_wrapper.pandas_save_json import PandasSaveJSON from .modules.pandas_wrapper.pandas_select_columns import PandasSelectColumns from .modules.pandas_wrapper.pandas_select_rows import PandasSelectRows from .modules.pandas_wrapper.pandas_series_to_string import PandasSeriesToString +from .modules.pandas_wrapper.pandas_series_to_dataframe import PandasSeriesToDataFrame from .modules.pandas_wrapper.pandas_show_dataframe import PandasShowDataFrame from .modules.pandas_wrapper.pandas_show_index import PandasShowIndex from .modules.pandas_wrapper.pandas_show_series import PandasShowSeries @@ -70,6 +71,7 @@ from .modules.pandas_wrapper.pandas_sub_series import PandasSubSeries from .modules.pandas_wrapper.pandas_sum import PandasSum from .modules.pandas_wrapper.pandas_summary import PandasSummary from .modules.pandas_wrapper.pandas_to_string import PandasToString +from .modules.pandas_wrapper.pandas_transpose import PandasTranspose from .modules.pandas_wrapper.pandas_var import PandasVar from .modules.pandas_wrapper.pandas_vertical_concat import PandasVerticalConcat from .modules.pandas_wrapper.pandas_vertical_split import PandasVerticalSplit @@ -137,6 +139,7 @@ NODE_CLASS_MAPPINGS: Dict[str, Type[T]] = { "PandasSelectColumns": PandasSelectColumns, "PandasSelectRows": PandasSelectRows, "PandasSeriesToString": PandasSeriesToString, + "PandasSeriesToDataFrame": PandasSeriesToDataFrame, "PandasShowDataFrame": PandasShowDataFrame, "PandasShowIndex": PandasShowIndex, "PandasShowSeries": PandasShowSeries, @@ -148,6 +151,7 @@ NODE_CLASS_MAPPINGS: Dict[str, Type[T]] = { "PandasSum": PandasSum, "PandasSummary": PandasSummary, "PandasToString": PandasToString, + "PandasTranspose": PandasTranspose, "PandasVar": PandasVar, "PandasVerticalConcat": PandasVerticalConcat, "PandasVerticalSplit": PandasVerticalSplit @@ -218,6 +222,7 @@ NODE_DISPLAY_NAME_MAPPINGS: Dict[str, str] = { "PandasSelectColumns": "Pandas Select Columns", "PandasSelectRows": "Pandas Select Rows", "PandasSeriesToString": "Pandas Series To String", + "PandasSeriesToDataFrame": "Pandas Series To DataFrame", "PandasShowDataFrame": "Pandas Show DataFrame", "PandasShowIndex": "Pandas Show Index", "PandasShowSeries": "Pandas Show Series", @@ -229,6 +234,7 @@ NODE_DISPLAY_NAME_MAPPINGS: Dict[str, str] = { "PandasSum": "Pandas Sum", "PandasSummary": "Pandas Summary", "PandasToString": "Pandas To String", + "PandasTranspose": "Pandas Transpose", "PandasVar": "Pandas Var", "PandasVerticalConcat": "Pandas Vertical Concat", "PandasVerticalSplit": "Pandas Vertical Split" diff --git a/docs/reference/node_reference.md b/docs/reference/node_reference.md index a787df0..f763f28 100644 --- a/docs/reference/node_reference.md +++ b/docs/reference/node_reference.md @@ -106,6 +106,8 @@ | [Pandas Horizontal Split](pandas_horizontal_split.md) | Horizontally splits a Pandas DataFrame into two pandas DataFrames. | | [Pandas Join](pandas_join.md) | Merges two pandas DataFrames based on a common column. | | [Pandas Rename](pandas_rename.md) | Renames an index (row label) or a column label. | +| [Pandas Series To Data Frame](pandas_series_to_dataframe.md) | Converts a Pandas Series to a DataFrame. | | [Pandas Sort](pandas_sort.md) | Sorts a pandas DataFrame by a specified column. | +| [Pandas Transpose](pandas_transpose.md) | Transposes a DataFrame. | | [Pandas Vertical Concat](pandas_vertical_concat.md) | Vertically concatenates two pandas DataFrames. | | [Pandas Vertical Split](pandas_vertical_split.md) | Vertically splits a Pandas DataFrame into two pandas DataFrames. | diff --git a/docs/reference/pandas_rename.md b/docs/reference/pandas_rename.md index 3a3132a..d786f5b 100644 --- a/docs/reference/pandas_rename.md +++ b/docs/reference/pandas_rename.md @@ -1,6 +1,6 @@ # Pandas Rename Renames an index (row label) or a column label. - +Currently, renaming only works for string labels. Renaming of integer labels is not supported. Note below node parameter description is incomplete due to a reference generator's bug: * axis takes columns or index. diff --git a/docs/reference/pandas_series_to_dataframe.md b/docs/reference/pandas_series_to_dataframe.md new file mode 100644 index 0000000..e96acaf --- /dev/null +++ b/docs/reference/pandas_series_to_dataframe.md @@ -0,0 +1,19 @@ +# Pandas Series To Data Frame +Converts a Pandas Series to a DataFrame. + +## Input +| Name | Data type | +|---|---| +| series | Series | +| label | String | +| transpose | Boolean | + +## Output +| Data type | +|---| +| DataFrame | + +
+Category: Transformation + +ComfyUI Data Analysis Node Reference. © 2025 Hide Inada (HowToSD.com). All rights reserved. diff --git a/docs/reference/pandas_transpose.md b/docs/reference/pandas_transpose.md new file mode 100644 index 0000000..6109dff --- /dev/null +++ b/docs/reference/pandas_transpose.md @@ -0,0 +1,17 @@ +# Pandas Transpose +Transposes a DataFrame. + +## Input +| Name | Data type | +|---|---| +| dataframe | DataFrame | + +## Output +| Data type | +|---| +| DataFrame | + +
+Category: Transformation + +ComfyUI Data Analysis Node Reference. © 2025 Hide Inada (HowToSD.com). All rights reserved. diff --git a/modules/pandas_wrapper/pandas_rename.py b/modules/pandas_wrapper/pandas_rename.py index 43d4003..a2bf75e 100644 --- a/modules/pandas_wrapper/pandas_rename.py +++ b/modules/pandas_wrapper/pandas_rename.py @@ -5,7 +5,7 @@ import pandas as pd class PandasRename: """ Renames an index (row label) or a column label. - + Currently, renaming only works for string labels. Renaming of integer labels is not supported. Note below node parameter description is incomplete due to a reference generator's bug: * axis takes columns or index. diff --git a/modules/pandas_wrapper/pandas_series_to_dataframe.py b/modules/pandas_wrapper/pandas_series_to_dataframe.py new file mode 100644 index 0000000..03dc3c5 --- /dev/null +++ b/modules/pandas_wrapper/pandas_series_to_dataframe.py @@ -0,0 +1,46 @@ +from typing import Any, Dict +import pandas as pd + +class PandasSeriesToDataFrame: + """ + Converts a Pandas Series to a DataFrame. + + category: Transformation + """ + + @classmethod + def INPUT_TYPES(cls) -> Dict[str, Any]: + """ + Defines the input types for the function. + + Returns: + Dict[str, Any]: A dictionary specifying required input types. + """ + return { + "required": { + "series": ("PDSERIES", {}), + "label": ("STRING", {"default": ""}), + "transpose": ("BOOLEAN", {"default": True}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, series: pd.Series, label: str, transpose: bool) -> tuple: + """ + Converts a Pandas Series to a DataFrame. + + Args: + series (Series): The Series. + label (str): The label for the Series in the DataFrame. + transpose (bool): Whether to transpose the DataFrame after conversion. + If True, Series will become a row. Otherwise it will become a column. + + Returns: + tuple: A tuple containing the DataFrame. + """ + df = series.to_frame(name=label) if label else series.to_frame() + df = df.transpose() if transpose else df + return (df,) diff --git a/modules/pandas_wrapper/pandas_transpose.py b/modules/pandas_wrapper/pandas_transpose.py new file mode 100644 index 0000000..b1eba05 --- /dev/null +++ b/modules/pandas_wrapper/pandas_transpose.py @@ -0,0 +1,39 @@ +from typing import Any, Dict +import pandas as pd + +class PandasTranspose: + """ + Transposes a DataFrame. + + category: Transformation + """ + + @classmethod + def INPUT_TYPES(cls) -> Dict[str, Any]: + """ + Defines the input types for the function. + + Returns: + Dict[str, Any]: A dictionary specifying required input types. + """ + return { + "required": { + "dataframe": ("DATAFRAME", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, dataframe: pd.DataFrame) -> tuple: + """ + Transposes a DataFrame. + + Args: + dataframe (DataFrame): The DataFrame. + + Returns: + tuple: A tuple containing a JSON string of the transposed DataFrame. + """ + return (dataframe.transpose(),) diff --git a/pyproject.toml b/pyproject.toml index 49ee18a..87fb4bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "data-analysis" description = "Data analysis custom modules for ComfyUI - Use Pandas & Matplotlib within ComfyUI" -version = "1.1.9" +version = "1.1.10" license = {file = "LICENSE"} [project.urls]