diff --git a/crates/polars-plan/src/logical_plan/conversion/expr_expansion.rs b/crates/polars-plan/src/logical_plan/conversion/expr_expansion.rs index 19894130c605..d960fd8a47bb 100644 --- a/crates/polars-plan/src/logical_plan/conversion/expr_expansion.rs +++ b/crates/polars-plan/src/logical_plan/conversion/expr_expansion.rs @@ -407,10 +407,19 @@ fn expand_struct_fields( polars_ensure!(name.as_ref() != "*", InvalidOperation: "cannot combine wildcards and column names"); if !exclude.contains(name) { - result.push(replace_struct_multiple_fields_with_field( - full_expr.clone(), - name, - )) + let mut new_expr = replace_struct_multiple_fields_with_field(full_expr.clone(), name); + match new_expr { + Expr::KeepName(expr) => { + new_expr = Expr::Alias(expr, name.clone()); + }, + Expr::RenameAlias { expr, function } => { + let name = function.call(&name)?; + new_expr = Expr::Alias(expr, ColumnName::from(name)); + }, + _ => {}, + } + + result.push(new_expr) } } Ok(()) diff --git a/py-polars/tests/unit/test_expansion.py b/py-polars/tests/unit/test_expansion.py index d4d9413d3cb9..8a5c7c76118b 100644 --- a/py-polars/tests/unit/test_expansion.py +++ b/py-polars/tests/unit/test_expansion.py @@ -131,3 +131,10 @@ def test_struct_field_expand_star() -> None: ) struct_df = df.select(pl.struct(["aaa", "bbb", "ccc", "ddd"]).alias("struct_col")) assert_frame_equal(struct_df.select(pl.col("struct_col").struct.field("*")), df) + + +def test_struct_field_expand_rewrite() -> None: + df = pl.DataFrame({"A": [1], "B": [2]}) + assert df.select( + pl.struct(["A", "B"]).struct.field("*").name.prefix("foo_") + ).to_dict(as_series=False) == {"foo_A": [1], "foo_B": [2]}