{"record":{"id":"10f1c5b341e6a456","repo":"pola-rs/polars","slug":"duplicate-column-names-found-series-columns-toli","errorCode":null,"errorMessage":"duplicate column names found: {series.columns.tolist()!s}","messagePattern":"duplicate column names found: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/_utils/construction/utils.py","lineNumber":118,"sourceCode":"def contains_nested(value: Any, is_nested: Callable[[Any], bool]) -> bool:\n    \"\"\"Determine if value contains (or is) nested structured data.\"\"\"\n    if is_nested(value):\n        return True\n    elif isinstance(value, dict):\n        return any(contains_nested(v, is_nested) for v in value.values())\n    elif isinstance(value, (list, tuple)):\n        return any(contains_nested(v, is_nested) for v in value)\n    return False\n\n\ndef is_simple_numpy_backed_pandas_series(\n    series: pd.Series[Any] | pd.Index[Any] | pd.DatetimeIndex,\n) -> bool:\n    if len(series.shape) > 1:\n        # Pandas Series is actually a Pandas DataFrame when the original DataFrame\n        # contains duplicated columns and a duplicated column is requested with df[\"a\"].\n        msg = f\"duplicate column names found: {series.columns.tolist()!s}\"  # type: ignore[union-attr]\n        raise ValueError(msg)\n    return (str(series.dtype) in PANDAS_SIMPLE_NUMPY_DTYPES) or (\n        series.dtype == \"object\"\n        and not series.hasnans\n        and not series.empty\n        and isinstance(next(iter(series)), str)\n    )\n","sourceCodeStart":100,"sourceCodeEnd":125,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/py-polars/src/polars/_utils/construction/utils.py#L100-L125","documentation":"is_simple_numpy_backed_pandas_series checks len(series.shape) > 1 to detect that a \"Series\" is actually a 2-D pandas DataFrame — which happens when the source DataFrame contains duplicated column labels and one of them is selected with df[\"a\"]. polars raises this ValueError rather than guessing which duplicate you meant.","triggerScenarios":"pl.Series(df[\"a\"]) / pl.from_pandas(df[\"a\"]) where the pandas frame has two columns labeled \"a\"; duplicate labels created by pd.concat(axis=1), joins, or renames.","commonSituations":"Joining frames that share column names without suffixes; CSVs with repeated headers; feeding df[col] from a loop over column names into polars.","solutions":["Deduplicate labels first: df = df.loc[:, ~df.columns.duplicated()].","Disambiguate manually: df.loc[:, df.columns == \"a\"].iloc[:, k].","Rename after concat/join so every label is unique before any conversion."],"exampleFix":"// before\npl.from_pandas(pdf[\"qty\"])  # \"qty\" appears twice in pdf\n\n// after\npdf = pdf.loc[:, ~pdf.columns.duplicated()]\npl.from_pandas(pdf[\"qty\"])","handlingStrategy":"validation","validationCode":"if not pdf.columns.is_unique:\n    dupes = pdf.columns[pdf.columns.duplicated()].tolist()\n    raise ValueError(f\"duplicate pandas column labels: {dupes}\")\ns = pl.Series(pdf[col])","typeGuard":"def pandas_columns_unique(pdf: pd.DataFrame) -> bool:\n    return bool(pdf.columns.is_unique)","tryCatchPattern":"try:\n    out = pl.from_pandas(pdf[col])\nexcept ValueError as e:\n    if \"duplicate column names found\" in str(e):\n        out = pl.from_pandas(pdf.loc[:, ~pdf.columns.duplicated()][col])\n    else:\n        raise","preventionTips":["Run pdf.columns.is_unique checks after concat/join/rename chains.","Set explicit suffixes in joins (lsuffix/rsuffix) to avoid collisions.","In column loops, use pdf.loc[:, pdf.columns == col].iloc[:, 0] for safety."],"tags":["pandas","duplicate-columns","validation","conversion"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}