Pyteryx/alteryx_runner/tools/transform/transpose_tool.py

35 lines
1.0 KiB
Python

from __future__ import annotations
from typing import Dict
import polars as pl
from tools.base import BaseTool
class TransposeTool(BaseTool):
def execute(self, inputs: Dict[str, pl.DataFrame]) -> Dict[str, pl.DataFrame]:
df = inputs.get("Input", pl.DataFrame())
if self.config is None or df.is_empty():
return {"Output": df}
keys = [
f.attrib["name"]
for f in self.config.findall("KeyFields/Field")
if f.attrib["name"] in df.columns
]
data_cols = [
f.attrib["name"]
for f in self.config.findall("DataFields/Field")
if f.attrib["name"] in df.columns
]
if not data_cols:
# Default: all non-key columns become data columns
data_cols = [c for c in df.columns if c not in keys]
result = df.unpivot(
on=data_cols,
index=keys,
variable_name="Name",
value_name="Value",
)
return {"Output": result}