У меня есть следующий код и вывод.
Код.
import polars as pl
df = pl.DataFrame({
'type': ['A', 'O', 'B', 'O'],
'id': ['CASH', 'ORB.A123', 'CHECK', 'OTC.BV32']
})
df.with_columns(sub_id=pl.when(pl.col('type') == 'O').then(pl.col('id').str.split('.')).otherwise(None))
Выход.
shape: (4, 3)
┌──────┬──────────┬─────────────────┐
│ type ┆ id ┆ sub_id │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ list[str] │
╞══════╪══════════╪═════════════════╡
│ A ┆ CASH ┆ null │
│ O ┆ ORB.A123 ┆ ["ORB", "A123"] │
│ B ┆ CHECK ┆ null │
│ O ┆ OTC.BV32 ┆ ["OTC", "BV32"] │
└──────┴──────────┴─────────────────┘
Теперь, как мне извлечь n-й элемент (или, в данном случае, последний элемент) каждого списка?
В частности, ожидаемый результат следующий.
shape: (4, 3)
┌──────┬──────────┬────────────┐
│ type ┆ id ┆ sub_id │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞══════╪══════════╪════════════╡
│ A ┆ CASH ┆ null │
│ O ┆ ORB.A123 ┆ "A123" │
│ B ┆ CHECK ┆ null │
│ O ┆ OTC.BV32 ┆ "BV32" │
└──────┴──────────┴────────────┘
Вы можете просто добавить .list.last(), чтобы выбрать последний элемент каждого списка.
В качестве альтернативы существует .list.get() для получения элементов списка по индексу.
import polars as pl
df = pl.DataFrame({
'type': ['A', 'O', 'B', 'O'],
'id': ['CASH', 'ORB.A123', 'CHECK', 'OTC.BV32']
})
df.with_columns(
sub_id=pl.when(
pl.col('type') == 'O'
).then(
pl.col('id').str.split('.').list.last()
)
)
shape: (4, 3)
┌──────┬──────────┬────────┐
│ type ┆ id ┆ sub_id │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞══════╪══════════╪════════╡
│ A ┆ CASH ┆ null │
│ O ┆ ORB.A123 ┆ A123 │
│ B ┆ CHECK ┆ null │
│ O ┆ OTC.BV32 ┆ BV32 │
└──────┴──────────┴────────┘
Обратите внимание, что я опустил .otherwise(None)
, так как это поведение по умолчанию выражения «если-то-иначе».
@Phil-ZXX Рад, что помогло! Предложенные вами позиции .list.last()
кажутся эквивалентными. Вы могли бы провести краткое сравнение производительности, но я сомневаюсь, что это имеет какое-либо значение.
Для n-го элемента вы должны использовать .list.get(n)
. Здесь вы можете установить параметр null_on_oob=True
, чтобы получить нулевые значения для выбора за пределами границ.
Спасибо. Есть ли разница между
then(pl.col('id').str.split('.').list.last())
иthen(pl.col('id').str.split('.')).list.last()
? А что, если нужен n-й элемент?