{"record":{"id":"041666f34117dc81","repo":"pola-rs/polars","slug":"duplicate-column-names-found-values-columns-toli","errorCode":null,"errorMessage":"duplicate column names found: {values.columns.tolist()}","messagePattern":"duplicate column names found: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/_utils/construction/other.py","lineNumber":49,"sourceCode":"    Returns\n    -------\n    :class:`pyarrow.Array`\n    \"\"\"\n    dtype = getattr(values, \"dtype\", None)\n    if dtype == \"object\":\n        first_non_none = get_first_non_none(values.values)  # type: ignore[arg-type]\n        if isinstance(first_non_none, str):\n            return pa.array(values, pa.large_utf8(), from_pandas=nan_to_null)\n        elif first_non_none is None:\n            return pa.nulls(length or len(values), pa.large_utf8())\n        return pa.array(values, from_pandas=nan_to_null)\n    elif dtype:\n        return pa.array(values, from_pandas=nan_to_null)\n    else:\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 = \"duplicate column names found: \"\n        raise ValueError(\n            msg,\n            f\"{values.columns.tolist()!s}\",  # type: ignore[union-attr]\n        )\n\n\ndef coerce_arrow(array: pa.Array) -> pa.Array:\n    \"\"\"...\"\"\"\n    import pyarrow.compute as pc\n\n    if hasattr(array, \"num_chunks\") and array.num_chunks > 1:\n        # small integer keys can often not be combined, so let's already cast\n        # to the uint32 used by polars\n        if pa.types.is_dictionary(array.type) and (\n            pa.types.is_int8(array.type.index_type)\n            or pa.types.is_uint8(array.type.index_type)\n            or pa.types.is_int16(array.type.index_type)\n            or pa.types.is_uint16(array.type.index_type)\n            or pa.types.is_int32(array.type.index_type)","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/py-polars/src/polars/_utils/construction/other.py#L31-L67","documentation":"During pandas-to-polars conversion, polars calls get_first_non_none on what it assumes is a Series. When the source pandas DataFrame has duplicated column labels, selecting that label (df[\"a\"]) returns a 2-D DataFrame, not a Series; polars detects the stray .columns attribute and refuses rather than silently converting ambiguous data.","triggerScenarios":"pd.DataFrame with two columns both named \"a\" (after concat/join/rename), then pl.Series(df[\"a\"]) or pl.from_pandas(df[\"a\"]).","commonSituations":"pd.concat(axis=1) or joins that repeat column labels; CSVs with repeated headers combined with rename operations that collapse names; generic code doing df[col] over user-supplied col names.","solutions":["Deduplicate labels before selecting: df = df.loc[:, ~df.columns.duplicated()].","Pick one occurrence explicitly: df.loc[:, df.columns == \"a\"].iloc[:, 0].","Rename columns to unique names right after the concat/join that created duplicates."],"exampleFix":"// before\npl.Series(pdf[\"a\"])  # pdf has two \"a\" columns\n\n// after\npdf = pdf.loc[:, ~pdf.columns.duplicated()]\npl.Series(pdf[\"a\"])","handlingStrategy":"validation","validationCode":"obj = pdf[col]\nif getattr(obj, \"ndim\", 1) > 1:  # duplicated label -> DataFrame\n    raise ValueError(f\"duplicate pandas columns: {obj.columns.tolist()}\")\ns = pl.Series(obj)","typeGuard":"def is_unique_pandas_column(pdf: pd.DataFrame, col: str) -> bool:\n    return (pdf.columns == col).sum() == 1","tryCatchPattern":"try:\n    s = pl.Series(pdf[col])\nexcept ValueError as e:\n    if \"duplicate column names found\" in str(e):\n        pdf = pdf.loc[:, ~pdf.columns.duplicated()]\n        s = pl.Series(pdf[col])\n    else:\n        raise","preventionTips":["Deduplicate right after any concat/join: pdf.loc[:, ~pdf.columns.duplicated()].","Assert pdf.columns.is_unique before column access loops.","Use df.loc[:, label].iloc[:, k] when duplicates are intentional."],"tags":["pandas","duplicate-columns","series","conversion"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}