Python-Polars: расчет перекрестных полей столбцов структурыPython

Программы на Python
Ответить
Anonymous
 Python-Polars: расчет перекрестных полей столбцов структуры

Сообщение Anonymous »

Я пытаюсь создать функцию, которая принимает список столбцов структуры, извлекает два поля и выполняет комбинацию между полями всех значений таких полей. Все в том же контексте. Например, для:

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

df = pl.DataFrame({
'cases': ['case_1', 'case_2'],
'value_1': [
{'value_decimal': 22.5, 'value_decimal_lb': 22.0, 'value_decimal_ub': 23.0},
{'value_decimal': 23.0, 'value_decimal_lb': 22.5, 'value_decimal_ub': 23.5}
],
'value_2': [
{'value_decimal': 5.0, 'value_decimal_lb': 5.0, 'value_decimal_ub': 5.0},
{'value_decimal': 5.0, 'value_decimal_lb': 6.0, 'value_decimal_ub': 5.0}
]
})

print(df)

shape: (2, 3)
┌────────┬──────────────────┬───────────────┐
│ cases  ┆ value_1          ┆ value_2       │
│ ---    ┆ ---              ┆ ---           │
│ str    ┆ struct[3]        ┆ struct[3]     │
╞════════╪══════════════════╪═══════════════╡
│ case_1 ┆ {22.5,22.0,23.0} ┆ {5.0,5.0,5.0} │
│ case_2 ┆ {23.0,22.5,23.5} ┆ {5.0,6.0,5.0} │
└────────┴──────────────────┴───────────────┘

Я хотел бы получить:

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

shape: (2, 4)
┌────────┬──────────────────┬───────────────┬─────────────────────────────────┐
│ cases  ┆ value_1          ┆ value_2       ┆ result                          │
│ ---    ┆ ---              ┆ ---           ┆ ---                             │
│ str    ┆ struct[3]        ┆ struct[3]     ┆ list[list[f64]]                 │
╞════════╪══════════════════╪═══════════════╪═════════════════════════════════╡
│ case_1 ┆ {22.5,22.0,23.0} ┆ {5.0,5.0,5.0} ┆ [[22.0, 5.0], [22.0, 5.0], … [… │
│ case_2 ┆ {23.0,22.5,23.5} ┆ {5.0,5.0,5.0} ┆ [[22.5, 5.0], [22.5, 6.0], … [… │
└────────┴──────────────────┴───────────────┴─────────────────────────────────┘

Этого я могу добиться с помощью вложения map_elements():

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

all_combinations = pl.struct(
[
# Extract the [lb, ub] lists for each column
col.map_elements(lambda x: [x['value_decimal_lb'], x['value_decimal_ub']]).alias(f'{col}_list')
for col in [pl.col('value_1'), pl.col('value_2')]
]
).map_elements(
# Compute all combinations
lambda x: [
list(combo) for combo in product(*[x[f'{col}_list'] for col in [pl.col('value_1'), pl.col('value_2')]])
])

print(df.with_columns(all_combinations))
Однако это решение неоптимально, и мне нужно заранее знать return_dtype столбца, который может отличаться в зависимости от входных столбцов.
Можете ли вы предложить, как реализовать это решение без использования Map_elements?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ct-columns
Ответить

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

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

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

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

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