Я пытаюсь заменить нулевые значения в столбце фрейма данных префиксом и возрастающими числами (чтобы сделать каждое уникальное). т.е.
df = pl.from_repr("""
┌──────────────┬──────────────┐
│ name ┆ asset_number │
│ --- ┆ --- │
│ str ┆ str │
╞══════════════╪══════════════╡
│ Office Chair ┆ null │
│ Office Chair ┆ null │
│ Office Chair ┆ null │
│ Office Chair ┆ CMP - 001 │
│ Office Chair ┆ CMP - 005 │
│ Office Chair ┆ null │
│ Table ┆ null │
│ Table ┆ CMP - 007 │
└──────────────┴──────────────┘
""")
нулевые значения следует заменить на что-то вроде PREFIX - 001, PREFIX - 002,...
df = df.with_columns(
pl.col("asset_number").fill_null(
"PREFIX - " + pl.int_range(pl.len()).cast(pl.String)
)
)
Вот один из способов использовать рейтинг ordinal
выше asset_number
. Чтобы добавить ведущие 0, мы используем .str.pad_start
.
df.with_columns(
pl.coalesce(
"asset_number",
"PREFIX - "
+ pl.all()
.rank("ordinal")
.over("asset_number")
.cast(pl.String)
.str.pad_start(3, "0"),
)
)
Выход:
shape: (8, 2)
┌──────────────┬──────────────┐
│ name ┆ asset_number │
│ --- ┆ --- │
│ str ┆ str │
╞══════════════╪══════════════╡
│ Office Chair ┆ PREFIX - 001 │
│ Office Chair ┆ PREFIX - 002 │
│ Office Chair ┆ PREFIX - 003 │
│ Office Chair ┆ CMP - 001 │
│ Office Chair ┆ CMP - 005 │
│ Office Chair ┆ PREFIX - 004 │
│ Table ┆ PREFIX - 005 │
│ Table ┆ CMP - 007 │
└──────────────┴──────────────┘
Полный код:
import polars as pl
df = pl.DataFrame(
{
"name": [
"Office Chair",
"Office Chair",
"Office Chair",
"Office Chair",
"Office Chair",
"Office Chair",
"Table",
"Table",
],
"asset_number": [
None,
None,
None,
"CMP - 001",
"CMP - 005",
None,
None,
"CMP - 007",
],
}
)
df = df.with_columns(
pl.coalesce(
"asset_number",
"PREFIX - "
+ pl.all()
.rank("ordinal")
.over("asset_number")
.cast(pl.String)
.str.pad_start(3, "0"),
)
)
print(df)
Вероятно, это будет медленнее, чем int_range
в другом ответе, но это присваивает числа по-другому: int_range
будет пропускать числа, значение которых не равно нулю, поэтому он назначает 0, 1, 2, 5, 6, а мой назначает 1, 2, 3, 4, 5.
Это то, что я действительно хотел. Еще раз большое спасибо!
По сути, это комбинация существующих ответов, но:
.is_null().cum_sum()
также является способом генерации возрастающих чисел.
pl.format может помочь с созданием строк.
df.with_columns(
pl.format(
"PREFIX - {}",
pl.col("asset_number").is_null().cum_sum()
.cast(pl.String)
.str.pad_start(3, "0")
)
)
shape: (8, 3)
┌──────────────┬──────────────┬──────────────┐
│ name ┆ asset_number ┆ literal │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞══════════════╪══════════════╪══════════════╡
│ Office Chair ┆ null ┆ PREFIX - 001 │
│ Office Chair ┆ null ┆ PREFIX - 002 │
│ Office Chair ┆ null ┆ PREFIX - 003 │
│ Office Chair ┆ CMP - 001 ┆ PREFIX - 003 │
│ Office Chair ┆ CMP - 005 ┆ PREFIX - 003 │
│ Office Chair ┆ null ┆ PREFIX - 004 │
│ Table ┆ null ┆ PREFIX - 005 │
│ Table ┆ CMP - 007 ┆ PREFIX - 005 │
└──────────────┴──────────────┴──────────────┘
Который можно подарить .fill_null()
df.with_columns(
pl.col("asset_number").fill_null(
pl.format(
"PREFIX - {}",
pl.col("asset_number").is_null().cum_sum()
.cast(pl.String)
.str.pad_start(3, "0")
)
)
)
shape: (8, 2)
┌──────────────┬──────────────┐
│ name ┆ asset_number │
│ --- ┆ --- │
│ str ┆ str │
╞══════════════╪══════════════╡
│ Office Chair ┆ PREFIX - 001 │
│ Office Chair ┆ PREFIX - 002 │
│ Office Chair ┆ PREFIX - 003 │
│ Office Chair ┆ CMP - 001 │
│ Office Chair ┆ CMP - 005 │
│ Office Chair ┆ PREFIX - 004 │
│ Table ┆ PREFIX - 005 │
│ Table ┆ CMP - 007 │
└──────────────┴──────────────┘
Спасибо, это тоже работает, и хороший подход к заполнению чисел. Просто из любопытства: является ли такой подход использования
ordinal rank
более производительным на больших наборах данных?