Объединение двух фреймов данных Polars с помощью соответствующего ключа и перекрытия диапазонов в указанных столбцах. ⇐ Python

Программы на Python
Anonymous
Объединение двух фреймов данных Polars с помощью соответствующего ключа и перекрытия диапазонов в указанных столбцах.

Сообщение Anonymous »

Предположим, у меня есть два фрейма данных, сгенерированные с помощью приведенного ниже кода:

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

df = pl.DataFrame({
'ID':[1, 2, 1, 2, 1, 2, 1, 1, 2, 2],
'Reference Value':[1.2, 3.5, 2.2, 1.4, 1.5, 3.7, 1.9, 1.1, 2.7, 3.8]
})

df2 = pl.DataFrame({
'ID':[1, 1, 1, 2, 2, 2, 3, 3, 3],
'Lower Reference Range':[1, 2, 3, 1, 2, 3, 1, 2, 3],
'Upper Reference Range':[2, 3, 4, 2, 3, 4, 2, 3, 4],
'Map Value':['a1','b1','c1','a2','b2', 'c2', 'a3', 'b3', 'c3']
})
Который генерирует кадр данных как таковой:

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

# df
shape: (10, 2)
┌─────┬─────────────────┐
│ ID  ┆ Reference Value │
│ --- ┆ ---             │
│ i64 ┆ f64             │
╞═════╪═════════════════╡
│ 1   ┆ 1.2             │
│ 2   ┆ 3.5             │
│ 1   ┆ 2.2             │
│ 2   ┆ 1.4             │
│ 1   ┆ 1.5             │
│ 2   ┆ 3.7             │
│ 1   ┆ 1.9             │
│ 1   ┆ 1.1             │
│ 2   ┆ 2.7             │
│ 2   ┆ 3.8             │
└─────┴─────────────────┘
# df2
shape: (9, 4)
┌─────┬───────────────────────┬───────────────────────┬───────────┐
│ ID  ┆ Lower Reference Range ┆ Upper Reference Range ┆ Map Value │
│ --- ┆ ---                   ┆ ---                   ┆ ---       │
│ i64 ┆ i64                   ┆ i64                   ┆ str       │
╞═════╪═══════════════════════╪═══════════════════════╪═══════════╡
│ 1   ┆ 1                     ┆ 2                     ┆ a1        │
│ 1   ┆ 2                     ┆ 3                     ┆ b1        │
│ 1   ┆ 3                     ┆ 4                     ┆ c1        │
│ 2   ┆ 1                     ┆ 2                     ┆ a2        │
│ 2   ┆ 2                     ┆ 3                     ┆ b2        │
│ 2   ┆ 3                     ┆ 4                     ┆ c2        │
│ 3   ┆ 1                     ┆ 2                     ┆ a3        │
│ 3   ┆ 2                     ┆ 3                     ┆ b3        │
│ 3   ┆ 3                     ┆ 4                     ┆ c3        │
└─────┴───────────────────────┴───────────────────────┴───────────┘

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

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

┌─────┬─────────────────┬───────────┐
│ ID  ┆ Reference Value ┆ Map Value │
│ --- ┆ ---             ┆ ---       │
│ i64 ┆ f64             ┆ str       │
╞═════╪═════════════════╪═══════════╡
│ 1   ┆ 1.2             ┆ a1        │
│ 2   ┆ 3.5             ┆ c2        │
│ 1   ┆ 2.2             ┆ b1        │
│ 2   ┆ 1.4             ┆ a2        │
│ ... ┆ ...             ┆ ...       │
│ 1   ┆ 1.9             ┆ a1        │
│ 1   ┆ 1.1             ┆ a1        │
│ 2   ┆ 2.7             ┆ b2        │
│ 2   ┆ 3.8             ┆ c2        │
└─────┴─────────────────┴───────────┘
Я реализовал простой наивный подход с помощью метода «когда и потом», как показано ниже:

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

def simple_when_then_mapper(df,df2,ref_id,ref_value,lower_range_col,upper_range_col,mapping_col):
'''
df = dataframe to map values unto
df2: reference dataframe
ref_id, ref_value,lower_range_col,upper_range_col,mapping_col: str referencing the column containing the Reference ID, Reference Value, etc
'''
for i in range(df2.shape[0]):
if 'query' not in locals():
query=(pl.when((pl.col(ref_id)==df2[ref_id][i]) &
(pl.col(ref_value)>df2[lower_range_col][i])&
(pl.col(ref_value)df2[lower_range_col][i])&
(pl.col(ref_value)

Подробнее здесь: [url]https://stackoverflow.com/questions/74781480/joining-two-polars-dataframes-via-a-matching-key-and-range-overlaps-on-specified[/url]

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