У меня есть два кадра данных, как показано ниже:
import polars as pl
df1 = pl.DataFrame(
{
"col1": [["a", "b", "c"], ["b", "c", "d"], ["a", "b", "c", "d"], ["d", "e", "f"]],
}
)
df2 = pl.DataFrame(
{
"col1": [["a", "b"], ["b", "c"], ["c", "d"], ["b", "c", "d"]],
"col2": ["1", "2", "3", "4"],
}
)
Я хочу найти значения из df1 в df2, выбирая все значения df2.col2 для строк, где все значения из списка df2.col1 присутствуют в списке df1.col1.
Похоже на https://github.com/pola-rs/polars/issues/4670, но я не думаю, что взрыв/соединение/группировка будет работать из-за ограничений памяти (dfs, с которыми я работаю, порядка 100 миллионов строк).
Есть ли способ сделать это полностью ленивым способом без применения? (Я использую Polars v0.18.4)
У меня есть работающий конвейер:
output = (
df1
.with_columns(
col2 = pl.col("col1").map_elements(
lambda x: df2
.filter(pl.col("col1").list.eval(pl.element().is_in(x)).list.min())
.select(pl.col("col2").flatten())
.get_column("col2")
.to_list(),
return_dtype=pl.List(pl.String)
)
)
)
И частичный нетерпеливый/ленивый конвейер (обратите внимание, что df2 не является ленивым, поскольку get_column недоступен для LazyFrames):
output = (
df1
.lazy()
.with_columns(
col2 = pl.col("col1").map_elements(
lambda x: df2
.filter(pl.col("col1").list.eval(pl.element().is_in(x)).list.min())
.select(pl.col("col2").flatten())
.get_column("col2")
.to_list(),
return_dtype=pl.List(pl.String)
),
)
.collect()
)
Но моя попытка создать полностью ленивый конвейер без применения не удалась, поскольку именованные столбцы не разрешены в list.eval.
На самом деле я не уверен, что это сработает в любом случае работает, поскольку столбец в .then(), скорее всего, не объединяется независимо для строк df1.
output = (
df1
.lazy()
.with_context(
df2
.lazy()
.select(pl.all().name.suffix("_2"))
)
.with_columns(
col2 =
pl.when(
pl.col("col1_2").list.eval(pl.element().is_in(pl.col("col1"))).list.min()
).then(
pl.col("col2_2").flatten()
),
)
.collect()
)
# ComputeError: named columns are not allowed in `list.eval`; consider using `element` or `col("")`
Подробнее здесь: https://stackoverflow.com/questions/766 ... -from-list
Извлечь значения из другого фрейма данных на основе присутствия всех значений из столбца list[str] в другом столбце list ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение