Нахождение количества различий между строками в PolarsPython

Программы на Python
Anonymous
Нахождение количества различий между строками в Polars

Сообщение Anonymous »

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

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

df = pl.DataFrame({"pop_1": ["100","0021"],"pop_2":["11002","0000",]})

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

| pop_1 | pop_2   |
|_______|_________|
| "100" | "11002" |
| "0021"| "0000"  |
col_1 row1 имеет 2 различия сама с собой (1 отличается от 0 два раза);
col_2 row1 имеет 8 отличий сама с собой;
col_1 и col_2 имеют 9 отличий между собой их в строке 1.
Наивная реализация этого будет такой:

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

def get_dxy(str1,str2):
diffs = 0
for x in str1:
for y in str2:
if x!=y:
diffs+=1
return diffs

def get_pi(str1):
diffs = 0
for i in range(len(str1)-1):
for j in range(i+1,len(str1)):
if str1[i]!=str1[j]:
diffs+=1
return diffs
Мне нужно сообщить об этих различиях в отдельных столбцах. Я могу сделать это, используя map_elements в каждой строке:

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

df = df.with_columns( pl.col('pop_1')
.map_elements(get_pi, return_dtype=pl.Int64)
.alias('pi_1')
)
df = df.with_columns( pl.col('pop_2')
.map_elements(get_pi, return_dtype=pl.Int64)
.alias('pi_2')
)

df = df.with_columns(
pl.struct("pop_1", "pop_2")
.map_elements(lambda cols: get_dxy(cols["pop_1"], cols["pop_2"]), return_dtype=pl.Int64)
.alias("dxy")
)
df

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

| pop_1 | pop_2   | pi_1  |   pi_2  |  dxy  |
|_______|_________|_______|_________|_______|
| "100" | "11002" |   2   |   8     |  9    |
| "0021"| "0000"  |   5   |   0     |  8    |
Однако мои данные слишком велики, и этот метод не очень быстрый. Мне было интересно, какой самый быстрый способ сделать это с помощью встроенных инструментов Polars (возможно, без использования map_elements?)
Могу ли я получить несколько советов, как это сделать?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-polars

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