From 798e9b40f36606f1abe16816a715f409bac7ba02 Mon Sep 17 00:00:00 2001 From: Daniel Bolin Date: Mon, 12 Feb 2024 11:02:07 -0500 Subject: [PATCH] Cast object dtype columns to strings in crosswalking --- containers/crosswalking/context/main.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/containers/crosswalking/context/main.py b/containers/crosswalking/context/main.py index 8990f22..3601b20 100644 --- a/containers/crosswalking/context/main.py +++ b/containers/crosswalking/context/main.py @@ -104,6 +104,8 @@ def crosswalk( result = matrix.copy() result.obs = merged_obs + _fix_obs_columns_dtype(result) + return result @@ -129,6 +131,18 @@ def _set_default_match(obs: pd.DataFrame, column: str) -> None: obs.loc[obs[column].isna(), column] = "skos:exactMatch" +def _fix_obs_columns_dtype(matrix: anndata.AnnData): + """Converts object and category columns to string to prevent errors when writing h5ad file. + + Args: + matrix (AnnData): Matrix to update + """ + for column in matrix.obs.columns: + array = matrix.obs[column] + if array.dtype in ("category", "object"): + matrix.obs[column] = array.astype(str) + + def _get_empty_table(args: argparse.Namespace) -> pd.DataFrame: """Creates an empty crosswalk table.