Скажем, у меня есть это:
df = polars.DataFrame(dict(
j=numpy.random.randint(10, 99, 10),
k=numpy.random.randint(10, 99, 10),
l=numpy.random.randint(10, 99, 10),
))
print(df)
shape: (10, 4)
j (i64) k (i64) l (i64)
32 82 34
67 40 53
11 81 86
10 13 36
70 80 62
91 31 90
18 59 51
98 67 92
23 13 25
57 78 74
shape: (10, 3)
и я хочу применить одно и то же условие when
/then
/otherwise
к нескольким столбцам:
dfj = (df
.select(
polars
.when(polars.selectors.numeric() < 50)
.then(polars.lit(1))
.otherwise(polars.lit(2))
)
)
Это не удается:
polars.exceptions.DuplicateError: the name: 'literal' is duplicate
Как мне использовать текущий выбранный столбец в качестве псевдонима? Т.е. Мне нужен эквивалент этого:
dfj = (df
.select(
polars
.when(polars.col(c) < 50)
.then(polars.lit(1))
.otherwise(polars.lit(2))
.alias(c)
for c in df.columns
)
)
print(dfj)
j (i32) k (i32) l (i32)
1 2 1
2 1 2
1 2 2
1 1 1
2 2 2
2 1 2
1 2 2
2 2 2
1 1 1
2 2 2
shape: (10, 3)
При использовании литеральных значений в then/иначе вы можете использовать .name.keep(), чтобы взять «исходные» имена столбцов.
(df
.select(
polars
.when(polars.selectors.numeric() < 50)
.then(polars.lit(1))
.otherwise(polars.lit(2))
.name.keep()
)
)
shape: (10, 3)
┌─────┬─────┬─────┐
│ j ┆ k ┆ l │
│ --- ┆ --- ┆ --- │
│ i32 ┆ i32 ┆ i32 │
╞═════╪═════╪═════╡
│ 1 ┆ 1 ┆ 2 │
│ 2 ┆ 1 ┆ 1 │
│ 1 ┆ 2 ┆ 1 │
│ 2 ┆ 2 ┆ 1 │
│ 2 ┆ 1 ┆ 2 │
│ 2 ┆ 2 ┆ 2 │
│ 2 ┆ 2 ┆ 1 │
│ 2 ┆ 2 ┆ 2 │
│ 1 ┆ 1 ┆ 2 │
│ 2 ┆ 2 ┆ 1 │
└─────┴─────┴─────┘
Хм... Кажется, это не работает, когда .then
использует столбец. Например. меняется на .then(polars.col('j'))
причины polars.exceptions.DuplicateError: the name: 'j' is duplicate
. Аналогично .otherwise(polars.col('k'))
терпит неудачу
Ах, я не знал о пространстве имен
.name
. Спасибо!