Я хочу сопоставить ключ в одном кадре данных Polars с другим Polars DF на основе связей между столбцами. Это всего лишь образец, полные DF1 и DF2 намного больше (2,5 миллиона и 1,5 миллиона строк соответственно).
Я хотел бы назначить ключ от DF2 до DF1, когда chrom соответствует chr, а начало и конец в DF1 содержатся в начале и конце в DF2.
Сначала я попытался перебрать строки DF1, ищем соответствующую запись в DF2:
sz = len(DF1[:,0])
for i in range(sz):
DF1[i,"key"] = DF2.filter(
(pl.col("chrom") == DF1[i,"chr"])
& (pl.col("begin") = DF1[i,"end"])
).select('key')[0,0]
Итерация строк в DF выполняется невероятно медленно. Это занимает около 10 часов.
Я также пробовал использовать np.array вместо непосредственного использования df. это немного быстрее, но все равно очень медленно.
Я ищу способ добиться этого, используя собственную структуру данных Polars. У меня нет ключа для присоединения, поэтому стратегии join и join_asof не работают.
Я хочу сопоставить ключ в одном кадре данных Polars с другим Polars DF на основе связей между столбцами. Это всего лишь образец, полные DF1 и DF2 намного больше (2,5 миллиона и 1,5 миллиона строк соответственно). [code]import polars as pl
DF2 = pl.DataFrame({ 'key' : [1,2,3,4,5,6], 'chrom' : ["GL000008.2", "GL000008.2", "GL000008.2", "GL000008.2","GL000008.2", "GL000008.2"], 'start': [14516,15377,17376,20177,22254, 24357], 'end': [14534,15403,17399,20195,22274,24377]}) [/code] Я хочу: [code]pl.from_repr(""" ┌────────────┬───────┬───────┬─────┐ │ chr ┆ start ┆ end ┆ key │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 │ ╞════════════╪═══════╪═══════╪═════╡ │ GL000008.2 ┆ 14516 ┆ 14534 ┆ 1 │ │ GL000008.2 ┆ 17380 ┆ 17399 ┆ 3 │ │ GL000008.2 ┆ 17381 ┆ 17399 ┆ 3 │ │ GL000008.2 ┆ 20177 ┆ 20195 ┆ 4 │ │ GL000008.2 ┆ 22254 ┆ 22274 ┆ 5 │ │ GL000008.2 ┆ 24357 ┆ 24377 ┆ 6 │ └────────────┴───────┴───────┴─────┘ """) [/code] Я хотел бы назначить ключ от DF2 до DF1, когда chrom соответствует chr, а начало и конец в DF1 содержатся в начале и конце в DF2. Сначала я попытался перебрать строки DF1, ищем соответствующую запись в DF2: [code]sz = len(DF1[:,0])
for i in range(sz): DF1[i,"key"] = DF2.filter( (pl.col("chrom") == DF1[i,"chr"]) & (pl.col("begin") = DF1[i,"end"]) ).select('key')[0,0] [/code] Итерация строк в DF выполняется невероятно медленно. Это занимает около 10 часов. Я также пробовал использовать np.array вместо непосредственного использования df. это немного быстрее, но все равно очень медленно. Я ищу способ добиться этого, используя собственную структуру данных Polars. У меня нет ключа для присоединения, поэтому стратегии join и join_asof не работают.