Используйте значения из одного фрейма данных, чтобы выбрать подстроку из другогоPython

Программы на Python
Anonymous
 Используйте значения из одного фрейма данных, чтобы выбрать подстроку из другого

Сообщение Anonymous »

Если фрейм данных содержит строки, как я могу использовать второй фрейм данных для получения фрагментов из первого в качестве новых столбцов?

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

df_strs = pl.DataFrame({
"Col_A": ["AAABBCCCC", "DDDEEFFFF"],
"Col_B": ["AAB", "DDE"]
})
print(df_strs)

df_offsets = pl.DataFrame({
"Reference_Col": ["Col_A", "Col_A", "Col_A", "Col_B", "Col_B"],
"Offset": [0, 3, 5, 0, 2],
"Length": [3, 2, 4, 2, 1],
"Alias": ["Col_A_1", "Col_A_2", "Col_A_3", "Col_B_1", "Col_B_2"]
})
print(df_offsets)

Вывод:

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

df_strs
shape: (2, 2)
┌───────────┬───────┐
│ Col_A     ┆ Col_B │
│ ---       ┆ ---   │
│ str       ┆ str   │
╞═══════════╪═══════╡
│ AAABBCCCC ┆ AAB   │
│ DDDEEFFFF ┆ DDE   │
└───────────┴───────┘

df_offsets
shape: (5, 4)
┌───────────────┬────────┬────────┬─────────┐
│ Reference_Col ┆ Offset ┆ Length ┆ Alias   │
│ ---           ┆ ---    ┆ ---    ┆ ---     │
│ str           ┆ i64    ┆ i64    ┆ str     │
╞═══════════════╪════════╪════════╪═════════╡
│ Col_A         ┆ 0      ┆ 3      ┆ Col_A_1 │
│ Col_A         ┆ 3      ┆ 2      ┆ Col_A_2 │
│ Col_A         ┆ 5      ┆ 4      ┆ Col_A_3 │
│ Col_B         ┆ 0      ┆ 2      ┆ Col_B_1 │
│ Col_B         ┆ 2      ┆ 1      ┆ Col_B_2 │
└───────────────┴────────┴────────┴─────────┘
Чтобы результирующий фрейм данных имел пять столбцов, где каждый столбец является ссылкой[offset:offset+length] с именем, определенным псевдонимом?
в приведенном выше примере результат будет следующим:

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

shape: (5, 4)
┌─────────┬─────────┬─────────┬─────────┬─────────┐
│ Col_A_1 ┆ Col_A_2 ┆ Col_A_3 ┆ Col_B_1 ┆ Col_B_2 │
│ ---     ┆ ---     ┆ ---     ┆ ---     ┆ ---     │
│ str     ┆ str     ┆ str     ┆ str     ┆ str     │
╞═════════╪═════════╪═════════╪═════════╪═════════╡
│ AAA     ┆ BB      ┆ CCCC    ┆ AA      ┆ B       │
│ DDD     ┆ EE      ┆ FFFF    ┆ DD      ┆ E       │
└─────────┴─────────┴─────────┴─────────┴─────────┘
Я могу сделать это с помощью циклов, но чувствую, что должен быть более идиоматический способ использования поляров. Мое текущее решение:

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

df_offsets = df_offsets.transpose() # this converts our ints to strs
for s in df_offsets:
df_strs = df_strs.with_columns(
pl.col(s[0]).str.slice(int(s[1]), int(s[2])).alias(s[3])
)

Вывод:

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

>>>print(df_strs)
shape: (2, 7)
┌───────────┬───────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│ Col_A     ┆ Col_B ┆ Col_A_0 ┆ Col_A_1 ┆ Col_A_2 ┆ Col_B_0 ┆ Col_B_1 │
│ ---       ┆ ---   ┆ ---     ┆ ---     ┆ ---     ┆ ---     ┆ ---     │
│ str       ┆ str   ┆ str     ┆ str     ┆ str     ┆ str     ┆ str     │
╞═══════════╪═══════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ AAABBCCCC ┆ AAB   ┆ AAA     ┆ BB      ┆ CCCC    ┆ AA      ┆ B       │
│ DDDEEFFFF ┆ DDE   ┆ DDD     ┆ EE      ┆ FFFF    ┆ DD      ┆ E       │
└───────────┴───────┴─────────┴─────────┴─────────┴─────────┴─────────┘
Есть ли более оптимизированный способ сделать это?


Подробнее здесь: https://stackoverflow.com/questions/737 ... om-another

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