【发布时间】:2018-12-30 21:37:19
【问题描述】:
我正在创建一个脚本,通过跟踪测试数据集中的错误来编辑 DNA 序列比对。我的目标是跟踪包含低于和超过某个阈值的终止密码子的列。例如,如果一列(包含 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 个样本,如果第 1 列中少于 4 个样本包含“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% 的样本中出现终止密码子的列时,才应在我的其他脚本中对其进行跟踪。 关于如何做到这一点的任何想法?谢谢!
【问题讨论】: