Я создаю сценарий для редактирования выравниваний последовательностей ДНК путем отслеживания ошибок из набора тестовых данных.Моя цель - отслеживать столбцы, которые содержат стоп-кодоны ниже и выше определенного порога.Например, если столбец (содержит 3 основания или кодон) содержит «TAA», «TGA» или «TAG» и если более 40% образцов содержат один из этих стоп-кодонов в столбце, я хочу сохранитьзапись об этом в отдельном файле Excel (который я могу создать), поскольку эти столбцы будут удалены.Если менее 40% выборок содержат стоп-кодон в столбце, я отслеживаю его отдельно, так как его нужно будет отредактировать.
Мой кадр данных выглядит примерно так (я добавил "/" здесь, чтобы показатькодоны здесь легче):
1 2 3 4 ... 1000
S1 TAA/TAA/TGA/CCC/.../TGA
S2 ATG/-AT/TAG/---/.../TGA
S3 ATG/TAA/-CC/--T/.../TAA
S4 ATG/TAA/GTA/CCC/.../TAA
S5 ATG/-AT/---/---/.../TAG
S6 ATG/TAA/-CC/--T/.../TAG
S7 ATG/TAA/GTA/CCC/.../CCC
S8 ATG/-AT/---/---/.../CCC
S9 ATG/TAA/-CC/--T/.../CCC
S10 ATG/TAA/-CC/--T/.../CCC
Я могу легко извлечь столбцы с пробелами (содержащие «---»), и мне удалось отследить столбцы со стоп-кодонами более 40%, но я не могу отследитьстолбцы, которые содержат менее 40%, и это потому, что он проходит по каждому из 3 кодонов в отдельности.Например, если у меня есть 10 выборок, если менее 4 выборок в столбце 1 содержат «TAA» или «TGA» или «TAG» (в любом комбо), я бы сохранил эту запись и изменил бы стоп-кодоны на «---"в окончательно отредактированном фрейме данных.Но когда каждый из стоп-кодонов появляется менее чем в 4 раза каждый, мой сценарий обрабатывает их по отдельности и показывает мне столбцы с более чем 40% остановками в нем, потому что я не могу понять, как сделать его суммированным по всем трем кодонам и рассматривать его каквсего.
df # (loaded earlier from a large script)
df_track = pd.DataFrame() # make new df to track less than 40% stop codons in columns
codon = ["TAA","TGA","TAG"]
def track_lessthan40(df, codon, 0.4):
num_rows = len(df)
change = [col for col in df.columns \
if sum(df[col] == codon[0]) > 0 or sum(df[col] == codon[1]) > 0 \
or sum(df[col] == codon[2]) > 0 \
and sum(df[col] == codon[0]) \
and sum(df[col] == codon[1]) \
and sum(df[col] == codon[2]) < round(num_rows*0.4, 2)]
df_change = df[change]
print(df_change)
Что я ожидаю:
df_change
1 3
S1 TAA/TGA
S2 ATG/TAG
S3 ATG/-CC
S4 ATG/GTA
S5 ATG/---
S6 ATG/-CC
S7 ATG/GTA
S8 ATG/---
S9 ATG/-CC
S10 ATG/-CC
Что я получу.
1 3 ... 1000
S1 TAA/TGA/.../TGA
S2 ATG/TAG/.../TGA
S3 ATG/-CC/.../TAA
S4 ATG/GTA/.../TAA
S5 ATG/---/.../TAG
S6 ATG/-CC/.../TAG
S7 ATG/GTA/.../CCC
S8 ATG/---/.../CCC
S9 ATG/-CC/.../CCC
S10 ATG/-CC/.../CCC
Последний столбец отображается, но не должен.Его следует отслеживать в моем другом сценарии, только если я хочу, чтобы столбцы, в которых стоп-кодоны присутствовали в более чем 40% выборок.Есть идеи, как это сделать?Спасибо!