Как переслать/назад заполнить пустые поля в столбце структуры с помощью Polars?Python

Программы на Python
Ответить
Anonymous
 Как переслать/назад заполнить пустые поля в столбце структуры с помощью Polars?

Сообщение Anonymous »

Этот код не заполняет нулевые значения в столбце. Я хочу, чтобы некоторые поля заполнялись нулями вперед и назад.

Код: Выделить всё

import polars as pl

df1 = pl.LazyFrame({
"dt": [
"2024-08-30",
"2024-08-02",
"2024-09-03",
"2024-09-04"
],
"df1": {
"a": [0.1, 0.2, 0.3, 0.1],
"b": [0, -1, 2, 1]
},
}).with_columns(
pl.col("dt").str.to_datetime("%Y-%m-%d")
)
df2 = pl.LazyFrame({
"dt": [
"2024-08-29",
"2024-08-30",
"2024-09-02",
"2024-09-03"
],
"df2":{
"a": [100, 120, -80, 20],
"b": [1, -2, 0, 0]
},
}).with_columns(
pl.col("dt").str.to_datetime("%Y-%m-%d")
)

df = pl.concat([df1, df2], how="align")

df = df.with_columns(
*[
pl.col(c).struct.with_fields(
pl.field("a").forward_fill().backward_fill(),
pl.field("b").forward_fill().backward_fill(),
)
for c in ["df1", "df2"]
]
)

print(df.collect())
В выводе появляются нулевые значения. Я ожидал бы, что они будут заполнены вперед и назад, но это не так.

Код: Выделить всё

┌─────────────────────┬───────────┬───────────┐
│ dt                  ┆ df1       ┆ df2       │
│ ---                 ┆ ---       ┆ ---       │
│ datetime[μs]        ┆ struct[2] ┆ struct[2] │
╞═════════════════════╪═══════════╪═══════════╡
│ 2024-08-02 00:00:00 ┆ {0.2,-1}  ┆ null      │
│ 2024-08-29 00:00:00 ┆ null      ┆ {100,1}   │
│ 2024-08-30 00:00:00 ┆ {0.1,0}   ┆ {120,-2}  │
│ 2024-09-02 00:00:00 ┆ null      ┆ {-80,0}   │
│ 2024-09-03 00:00:00 ┆ {0.3,2}   ┆ {20,0}    │
│ 2024-09-04 00:00:00 ┆ {0.1,1}   ┆ null      │
└─────────────────────┴───────────┴───────────┘
Я ожидал такого результата:

Код: Выделить всё

┌─────────────────────┬───────────┬───────────┐
│ dt                  ┆ df1       ┆ df2       │
│ ---                 ┆ ---       ┆ ---       │
│ datetime[μs]        ┆ struct[2] ┆ struct[2] │
╞═════════════════════╪═══════════╪═══════════╡
│ 2024-08-02 00:00:00 ┆ {0.2,-1}  ┆ {100,1}   │
│ 2024-08-29 00:00:00 ┆ {0.2,-1}  ┆ {100,1}   │
│ 2024-08-30 00:00:00 ┆ {0.1,0}   ┆ {120,-2}  │
│ 2024-09-02 00:00:00 ┆ {0.1,0}   ┆ {-80,0}   │
│ 2024-09-03 00:00:00 ┆ {0.3,2}   ┆ {20,0}    │
│ 2024-09-04 00:00:00 ┆ {0.1,1}   ┆ {20,0}    │
└─────────────────────┴───────────┴───────────┘
Как это сделать и почему не заполняются нулевые значения в столбце? Вероятно, это можно сделать с помощью pl.col(c).forward_fill().backward_fill(), но что, если я хочу, чтобы было заполнено только одно поле?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ing-polars
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»