Я новичок в Polars. Я пытаюсь использовать метод .unnest() для столбца во фрейме данных Polars. В приведенном ниже примере я генерирую столбец «обработанный» как списки строк. Строки состоят из последовательности и процентов, преобразованных в строку. Моя цель — отключить все списки в ячейках столбца и создать два других столбца: один для последовательности, а другой для соответствующего процента. Хотя я уже использовал метод unnest в идентичном случае (это сработало), сейчас он не работает. Я думаю, что есть некоторая проблема, связанная с созданием столбца «обработано». Однако я не могу понять, в чем проблема.
Мой код:
import polars as pl
from functools import reduce
# Function to MAP the peptide inside the protein sequence.
# Convert the peptide sequence in dashes inside the original protein sequence.
def replace_peptide(protein_sequence, peptide):
return protein_sequence.replace(peptide, '-' * len(peptide))
# Function to COLLAPSE all the dashed protein sequences to generate a final sequence
# that reports a "-" for each letter in the peptide sequence that map in the protein sequence.
def combine_sequences(seq1, seq2):
return ''.join(['-' if a == '-' or b == '-' else a for a, b in zip(seq1, seq2)])
# Function to apply the mapping procedure for each row in the dataframe.
def process_row(row):
protein_sequence = row['sequence']
protein_sequence_len = len(protein_sequence)
peptides = row['peptide']
modified_sequences = [replace_peptide(protein_sequence, peptide) for peptide in peptides]
final_sequence = reduce(combine_sequences, modified_sequences)
coverage = str('{:.2f}%').format(final_sequence.count('-')/protein_sequence_len*100)
return final_sequence, coverage
# -----------------------------------------------------------------------------------------------#
# Generate the data frame
coverage_fasta=pl.DataFrame({"protein_id": ["A0A024RBG1", "A0A087X1C5", "A0A0B4J2F0"],
"sequence": ["MMKFKPNQTRTYDREGFKKRAACLCFRSEQEDEVLLVSSSRYPDQWIVPG",
"MGLEALVPLAMIVAIFLLLVDLMHRHQRWAARYPPGPLPLPGLGNLLHVD",
"MFRRLTFAQLLFATVLGIAGGVYIFQPVFEQYAKDQKELKEKMQLVQESE"],
"peptide": [["MMKFKPNQT", "FKKRAA", "SSSRYPDQ"],
["EALVPLAM", "AQLLFATVLGIAG", "QPVFEQYAKDQ"],
["RRLTFAQLL", "LTFAQLLFATVLGIAGG", "QYAKDQKEL"]
]}
)
# Generate the column that contain a list made by the protein sequences dashed and their coverage percentage.
coverage_fasta = coverage_fasta.with_columns(
pl.struct(["sequence", "peptide"]).map_elements(lambda row: process_row(row),
return_dtype=pl.List(pl.String())
).alias("processed"))
display(coverage_fasta)
# Command to unnest the lists in the "processed" column.
# The purpose is to have the dashed sequences in one column and the percentage of coverage in another one.
coverage_fasta = coverage_fasta.with_columns(pl.col("processed")).unnest("processed")
display(coverage_fasta)
Выход:
Пожалуйста, может кто-нибудь объяснить, что я делаю неправильно?
Как уже упоминалось в комментариях, pl.DataFrame.unnest
используется для отсоединения столбцов структуры от их полей. Вместо этого ваша функция map_elements
создает столбец типа list[str]
.
Вы можете адаптировать свою функцию для возврата структуры с полями final_sequence
и coverage
(и вместо этого адаптировать return_dtype
).
def process_row(row):
...
return {"final_sequence": final_sequence, "coverage": coverage}
coverage_fasta = coverage_fasta.with_columns(
pl.struct(["sequence", "peptide"]).map_elements(
lambda row: process_row(row),
return_dtype=pl.Struct([
pl.Field("final_sequence", pl.String()),
pl.Field("coverage", pl.String())
])
).alias("processed")
)
Тогда отмена вложения должна работать как положено.
pl.Config.set_fmt_str_lengths(16)
pl.Config.set_tbl_width_chars(128)
coverage_fasta.unnest("processed")
shape: (3, 5)
┌────────────┬───────────────────┬───────────────────┬───────────────────┬──────────┐
│ protein_id ┆ sequence ┆ peptide ┆ final_sequence ┆ coverage │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ list[str] ┆ str ┆ str │
╞════════════╪═══════════════════╪═══════════════════╪═══════════════════╪══════════╡
│ A0A024RBG1 ┆ MMKFKPNQTRTYDREG… ┆ ["MMKFKPNQT", "F… ┆ ---------RTYDREG… ┆ 46.00% │
│ A0A087X1C5 ┆ MGLEALVPLAMIVAIF… ┆ ["EALVPLAM", "AQ… ┆ MGL--------IVAIF… ┆ 16.00% │
│ A0A0B4J2F0 ┆ MFRRLTFAQLLFATVL… ┆ ["RRLTFAQLL", "L… ┆ MF--------------… ┆ 56.00% │
└────────────┴───────────────────┴───────────────────┴───────────────────┴──────────┘
unnest предназначен для структур, но
processed
естьlist
— вы пытаетесь взорвать/сгладить списки?