Я пытаюсь заполнить новое поле, содержащее структуру всех других полей из другого отложенного фрейма на основе предиката.
Пока примеры на питоне, я открыт для ответов на питоне или ржавчине.
companies = pl.DataFrame({
"id": [1],
"name": ["google"],
"industry": [1001]
}).lazy()
industries = pl.DataFrame({
"id": [1001],
"name": ["tech"],
"sectors": [[10011, 10012]]
}).lazy()
expected = pl.DataFrame({
"id": [1],
"name": ["polars"],
"industry": [{
"name": "tech",
"sectors": [[10011, 10012]]
}]
})
Я могу сделать это наивно через join -> select -> to_struct -> lit, но это не идеально, так как мне нужно выполнить сбор на ленивом фрейме, чтобы получить желаемые результаты.
right_columns = industries.schema.keys()
industry_matches = companies.join(
industries,
left_on = "industry",
right_on = "id",
how = "inner"
).collect().select(right_columns).drop(["id"]).to_struct("industry")
df = companies.with_column(pl.lit(industry_matches))
df.collect()
В идеале я хотел бы сделать что-то вроде объединения в таком выражении.
companies.select([
pl.col("*"),
pl.col("industry").join(industries, on = "id").exclude(["id"]),
])
но я открыт для любых альтернатив, которые не требуют collect
Будет ли это работать для вас:
(
companies
.join(
industries
.select([
pl.col('id').alias('industry'),
pl.struct(pl.exclude('id')).alias('industry_struct'),
]),
on = "industry",
how = "inner"
)
.drop('industry')
.collect()
)
shape: (1, 3)
┌─────┬────────┬─────────────────────────┐
│ id ┆ name ┆ industry_struct │
│ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ struct[2] │
╞═════╪════════╪═════════════════════════╡
│ 1 ┆ google ┆ {"tech",[10011, 10012]} │
└─────┴────────┴─────────────────────────┘
По сути, мы создаем структуру внутри самого соединения.