TLDR: мне нужно сопоставить повторяющиеся строки 1:1 внутри кадра данных. Есть ли способ заставить результат операции соединения отображаться в соотношении 1:1 (применить параметр «validate»)?:
Пример:
schema = {
"id": pl.String,
"partition_number": pl.String,
"type": pl.String,
"state": pl.Int64,
"price": pl.Float64,
"quantity": pl.Int64,
"source": pl.Int64,
"some_other_random_column": pl.Int64,
}
df = pl.read_csv("data.csv", schema=schema)
source1 = df.filter(pl.col('source') == 1)
source2 = df.filter(pl.col('source') == 2)
overlap = source1.join(source2, on=['partition_number', 'type', 'state', 'price',
'quantity'], how='inner', suffix='_other')
Если в любом из них есть повторяющиеся строки, это приведет к сопоставлению one_to_many/many_to_many. Так, например, формы (50,7) и (55,7) могут привести к образованию кадра данных (78,7) после объединения. Я хочу, чтобы в лучшем случае всегда было (50,7). Затем я могу проверить, какие строки отсутствуют в другом кадре данных, выполнив (но мне это не нужно):
all_rows= source1.join(source2, on=['partition_number', 'type', 'state', 'price',
'quantity'], how='full', suffix='_other')
only_in_source1 = all_rows.filter(pl.col('quantity_other').is_null()) # (0,7)
only_in_source2 = all_rows.filter(pl.col('quantity').is_null()) # (5,7)
Я думаю, что теоретически, выполнив второй блок кода, я могу вычислить, сколько существует уникальных сопоставлений 1:1, но я хочу, чтобы они были сопоставлены, а не просто знали число, независимо от порядка. Затем я могу присвоить им значение "mapped_id".
Это не обязательно делать таким образом, я думал, что аналогичный подход, вероятно, будет самым быстрым, но любое предложение, которое поможет мне оптимизировать отображение строк 1:1, будет отличным.
EDIT: Добавлен пример ввода, а также добавлен столбец "id" в схему, извините, я забыл поместить его туда в начале.
Пример ввода:
df = pl.from_repr("""
┌──────┬──────────────────┬──────┬───────┬───────┬──────────┬────────┬──────────────────────────┐
│ id ┆ partition_number ┆ type ┆ state ┆ price ┆ quantity ┆ source ┆ some_other_random_column │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str ┆ i64 ┆ f64 ┆ i64 ┆ i64 ┆ i64 │
╞══════╪══════════════════╪══════╪═══════╪═══════╪══════════╪════════╪══════════════════════════╡
│ s1_1 ┆ p1 ┆ A ┆ 1 ┆ 100.0 ┆ 10 ┆ 1 ┆ 1001 │
│ s1_2 ┆ p1 ┆ A ┆ 1 ┆ 100.0 ┆ 10 ┆ 1 ┆ 1001 │
│ s1_3 ┆ p2 ┆ B ┆ 2 ┆ 150.0 ┆ 20 ┆ 1 ┆ 1002 │
│ s1_4 ┆ p3 ┆ C ┆ 1 ┆ 200.0 ┆ 30 ┆ 1 ┆ 1003 │
│ s2_1 ┆ p1 ┆ A ┆ 1 ┆ 100.0 ┆ 10 ┆ 2 ┆ 1004 │
│ s2_2 ┆ p1 ┆ A ┆ 1 ┆ 100.0 ┆ 10 ┆ 2 ┆ 1004 │
│ s2_3 ┆ p1 ┆ A ┆ 1 ┆ 100.0 ┆ 10 ┆ 2 ┆ 1004 │
│ s2_4 ┆ p2 ┆ B ┆ 2 ┆ 150.0 ┆ 20 ┆ 2 ┆ 1005 │
│ s2_5 ┆ p4 ┆ D ┆ 1 ┆ 250.0 ┆ 40 ┆ 2 ┆ 1006 │
└──────┴──────────────────┴──────┴───────┴───────┴──────────┴────────┴──────────────────────────┘
""")
И пример вывода:
shape: (3, 9)
┌──────┬──────────────────┬──────┬───────┬───────┬──────────┬────────┬──────────────────┬──────────┐
│ id ┆ partition_number ┆ type ┆ state ┆ price ┆ quantity ┆ source ┆ some_other_rando ┆ id_other │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ m_column ┆ --- │
│ str ┆ str ┆ str ┆ i64 ┆ f64 ┆ i64 ┆ i64 ┆ --- ┆ str │
│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ i64 ┆ │
╞══════╪══════════════════╪══════╪═══════╪═══════╪══════════╪════════╪══════════════════╪══════════╡
│ s1_1 ┆ p1 ┆ A ┆ 1 ┆ 100.0 ┆ 10 ┆ 1 ┆ 1001 ┆ s2_1 │
│ s1_2 ┆ p1 ┆ A ┆ 1 ┆ 100.0 ┆ 10 ┆ 1 ┆ 1001 ┆ s2_2 │
│ s1_3 ┆ p2 ┆ B ┆ 2 ┆ 150.0 ┆ 20 ┆ 1 ┆ 1002 ┆ s2_4 │
└──────┴──────────────────┴──────┴───────┴───────┴──────────┴────────┴──────────────────┴──────────┘
Или достаточно короче (но это можно просто отфильтровать из вывода выше):
shape: (3, 2)
┌──────┬──────────┐
│ id ┆ id_other │
│ --- ┆ --- │
│ str ┆ str │
╞══════╪══════════╡
│ s1_1 ┆ s2_1 │
│ s1_2 ┆ s2_2 │
│ s1_3 ┆ s2_4 │
└──────┴──────────┘
Подробнее здесь: https://stackoverflow.com/questions/786 ... rce-11-map