我正在创建一个脚本,通过跟踪测试数据集中的错误来编辑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%的样本中出现停止密码子的列时,才应该在我的其他脚本中跟踪它。 有什么办法吗?谢谢您!你知道吗
似乎您的示例代码的组成和您使用的df之间可能存在差异。Jon稍微调整的示例和我的脚本适用于您的示例(见图)。你知道吗
IIUC公司
df.isin(codon).sum()/len(df) <= 0.4
输出您可以选择如下列:
使用^{} 检查列中是否有任何停止密码子,求和以计算其为真的次数,除以数据帧的长度以获得百分比。你知道吗
相关问题 更多 >
编程相关推荐