From 60532312d016561eeb8879a491e9e734a92b18ef Mon Sep 17 00:00:00 2001 From: Ludwig Lierhammer Date: Fri, 26 Jun 2026 13:20:25 +0100 Subject: [PATCH] restore string literals in columns for ParquetSttreamReader items --- src/cdm_reader_mapper/common/iterators.py | 55 +++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/cdm_reader_mapper/common/iterators.py b/src/cdm_reader_mapper/common/iterators.py index 94e97bb2..7726463d 100755 --- a/src/cdm_reader_mapper/common/iterators.py +++ b/src/cdm_reader_mapper/common/iterators.py @@ -768,6 +768,59 @@ def _make_parquet_reader(d: TemporaryDirectory[str], t: type, s: str | None) -> return tuple(final_iterators + output_non_data) +def _restore_columns(item: Any) -> Any: + """ + Restore columns from string literals if `item` is a pandas DataFrame or Series. + + Parameters + ---------- + item : Any + Object to restore. + + Returns + ------- + Any + Restored object. + """ + + def _literal_eval(column: Any) -> Any: + """ + Evaluate a string literal if possible. + + Parameters + ---------- + column : Any + Column that is possibly a string literal. + + Returns + ------- + Any + Evaluated column. + """ + if not isinstance(column, str): + return column + try: + from ast import literal_eval + + return literal_eval(column) + except (ValueError, SyntaxError): + return column + + if isinstance(item, pd.DataFrame): + columns = item.columns + new_columns = [] + for column in columns: + column = _literal_eval(column) + new_columns.append(column) + + item.columns = new_columns + + if isinstance(item, pd.Series): + item.name = _literal_eval(item.name) + + return item + + def _process_chunks( readers: list[ParquetStreamReader], func: Callable[..., Any], @@ -835,6 +888,8 @@ def _process_chunks( for items in zip(*readers, strict=True): _validate_chunk(items, requested_types) + items = tuple([_restore_columns(item) for item in items]) + result = func(*items, *static_args, **static_kwargs) data, meta = _process_result(result, requested_types, non_data_output, chunk_counter)