Python 无法从数据帧中提取正确的列

Python 无法从数据帧中提取正确的列,python,pandas,dataframe,Python,Pandas,Dataframe,我正在创建一个脚本,通过跟踪测试数据集中的错误来编辑DNA序列比对。我的目标是跟踪包含低于或超过某个阈值的终止密码子的列。例如,如果一个列(包含3个碱基或一个密码子)包含“TAA”、“TGA”或“TAG”,并且如果超过40%的样本包含该列中的一个终止密码子,我希望在单独的excel文件(我可以创建)中保留该列的记录,因为这些列将被删除。如果少于40%的样本在一列中包含终止密码子,我会单独跟踪,因为这些需要编辑 我的数据框看起来像这样(我在这里添加了“/”,只是为了更容易地显示密码子): 我可以很

我正在创建一个脚本,通过跟踪测试数据集中的错误来编辑DNA序列比对。我的目标是跟踪包含低于或超过某个阈值的终止密码子的列。例如,如果一个列(包含3个碱基或一个密码子)包含“TAA”、“TGA”或“TAG”,并且如果超过40%的样本包含该列中的一个终止密码子,我希望在单独的excel文件(我可以创建)中保留该列的记录,因为这些列将被删除。如果少于40%的样本在一列中包含终止密码子,我会单独跟踪,因为这些需要编辑

我的数据框看起来像这样(我在这里添加了“/”,只是为了更容易地显示密码子):

我可以很容易地提取有间隙的列(包含“--”),并且我能够跟踪终止密码子超过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)
我得到了什么

    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%的样本中出现停止密码子的列时,才应该在我的其他脚本中跟踪它。 有什么办法吗?谢谢大家!

IIUC
df.isin(密码子).sum()/len(df)IIUC

df.isin(codon.sum()/len(df)您的示例代码的构成与您使用的df之间似乎存在差异。Jon稍微调整的示例和我的脚本适用于您的示例(见图)

#我笨拙的例子
作为pd进口熊猫
csv='/Users//PycharmProjects/stackoverflow/gattaka.text'
df=pd.read_表(csv,sep='/'))
df_track=pd.DataFrame()#使新的df跟踪列中少于40%的终止密码子
密码子=[“TAA”,“TGA”,“TAG”]
对于df.columns中的列:
col_length=len(df[列])
col_list=df[column].tolist()
总和=0
对于col_列表中的基因:
如果基因位于密码子中:
总和_+=1
如果总和=0:
打破

elif sum_stopper您的示例代码的构成与您使用的df之间似乎存在差异。Jon稍微调整的示例和我的脚本适用于您的示例(见图)

#我笨拙的例子
作为pd进口熊猫
csv='/Users//PycharmProjects/stackoverflow/gattaka.text'
df=pd.read_表(csv,sep='/'))
df_track=pd.DataFrame()#使新的df跟踪列中少于40%的终止密码子
密码子=[“TAA”,“TGA”,“TAG”]
对于df.columns中的列:
col_length=len(df[列])
col_list=df[column].tolist()
总和=0
对于col_列表中的基因:
如果基因位于密码子中:
总和_+=1
如果总和=0:
打破

elif sum_:我试过了,但是它为我返回了整个df,而不是一个只包含我需要的列的新df。这应该是我的循环吗?我刚刚尝试了你在没有for循环的情况下单独键入的内容。我正在测试的示例数据帧实际上有1000列lol,我正在将每一列都取回。它为我翻转了整个数据帧……如果我在函数中使用这行代码,这是不正确的吗?我注释掉了for循环中的所有行,并使用了你的…也许我写得不正确。让我们来聊聊吧:我试过了,但它为我返回了整个df,而不是一个只包含我需要的列的新df。这应该是我的循环吗?我刚刚尝试了你在没有for循环的情况下单独键入的内容。我正在测试的示例数据帧实际上有1000列lol,我正在将每一列都取回。它为我翻转了整个数据帧……如果我在函数中使用这行代码,这是不正确的吗?我在for循环中注释掉了我的所有行,并使用了你的…也许我写得不正确。让我们来聊聊:它做的正好相反,它给了我一个没有这些列的表,但我必须单独保留这些列的记录(在df_change中),然后,我在一个新的数据框中将停止点编辑成间隙,这样我就不会丢失整个列。我唯一一次删除整个列是如果超过40%的样本中出现终止密码子。脚本还将我所有的示例名称都改为索引lol。我有点困惑。我认为您需要的数据格式如您的回答中所示为“我期望的:”。我对代码做了一些修改。1.不包含止动块的列将被忽略2。现在只有含有超过40%止动块的列返回3。系列附加到df-我希望解决“索引”转换问题对不起,我有两组表。在我打开的这个问题中,我想得到所有的列,其中停止密码子出现在不到40%的样本中(因此它们存在但不超过40%,如果超过40%,我有一个单独的代码将其保存在一个单独的文件中)。原因是,如果它们存在但不到40%,我会将这些停止编辑为间隙。如果它们出现在超过40%的样本中,我会删除整个列。所以我所展示的是当它低于40%时我所期望得到的。如果超过40%,我希望只显示最后一列。我再次尝试了你的代码,但它不起作用,只返回空数据帧。它与我的脚本有点配合,我只是需要一种方法,让它将一列中的所有3个终止密码子计算为不到40%样本中存在的所有终止密码子的总数。在这个版本中,我添加了Jon和我使用的文本文件。我无能为力,祝你好运,它的作用正好相反,
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
#    1       True
#  2        False
# 3          True
#   4        True
# 1000      False
df.loc[:, df.isin(codon).sum()/len(df) <= 0.4]
# 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)]