无法从pandas数据框中提取正确的列

2024-05-02 13:31:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个脚本,通过跟踪测试数据集中的错误来编辑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%的样本中出现停止密码子的列时,才应该在我的其他脚本中跟踪它。 有什么办法吗?谢谢您!你知道吗


Tags: 脚本dftagcolchangecc样本密码子
2条回答

似乎您的示例代码的组成和您使用的df之间可能存在差异。Jon稍微调整的示例和我的脚本适用于您的示例(见图)。你知道吗

enter image description here

# my clunky example
import pandas as pd
csv = '/Users/<USER>/PycharmProjects/stackoverflow/gattaka.text'

df = pd.read_table(csv, sep='/')

df_track = pd.DataFrame()  # make new df to track less than 40% stop codons in columns
codon = ["TAA", "TGA", "TAG"]

for column in df.columns:
    col_length = len(df[column])
    col_list = df[column].tolist()

    sum_stopper = 0
    for gene in col_list:
        if gene in codon:
            sum_stopper += 1

    if sum_stopper == 0:
        break

    elif sum_stopper <= (0.4 * col_length):
        col_series = pd.Series(col_list, name=column)
        df_track[column] = col_series

print(df_track)
print('   ')

# Jon's adjusted, pretty, concise and pythonic example
df_track = df.loc[:, (df.isin(codon).sum()/len(df) <= 0.4) & (df.isin(codon).sum() > 0)]

IIUC公司 df.isin(codon).sum()/len(df) <= 0.4 输出

#    1       True
#  2        False
# 3          True
#   4        True
# 1000      False

您可以选择如下列:

df.loc[:, df.isin(codon).sum()/len(df) <= 0.4]

使用^{}检查列中是否有任何停止密码子,求和以计算其为真的次数,除以数据帧的长度以获得百分比。你知道吗

相关问题 更多 >