【问题标题】:Drop row in a for loop Python在 for 循环 Python 中删除行
【发布时间】:2022-10-20 20:43:17
【问题描述】:

我有一个(非常大的)熊猫数据框,如下所示:

Sequence
AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAC
AAAAAAAAAAAAAAAAAAAAAAAAG
AAAAAAAAAAAAAAAAAAAAAAAAT
AAAACAGAAGGTGTCCCAATACTAT
AAAACAGATCTCGGCAGATTGGATG
AAAACAGATCTCGGTAGACTGGACG

我想删除 A 的百分比大于 0.80 的行。 这是我的代码:

sequences = file[['Sequence']]

seq_A = 'A' * 25

for row in range(len(file)):
    par1 =  file.iloc[row,0]
    
    # compare sequence with homopolymer and check ratio of match
    ratioA = difflib.SequenceMatcher(None, par1, seq_A).ratio()
        
    if ratioA >= 0.80:
        sequences.drop(row, axis=0, inplace=True)
        # lista.append(row)

但是,当我使用已插入索引(不删除行)的新列表检查具有此类功能的行数时,索引数与已删除行数不匹配。 非常感谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您通常应该避免使用 pandas 循环。您可以这样做:

    df.loc[df['Sequence'].str.count('A') / df['Sequence'].str.len() <= 0.8]
    

    产生:

                        Sequence
    4  AAAACAGAAGGTGTCCCAATACTAT
    5  AAAACAGATCTCGGCAGATTGGATG
    6  AAAACAGATCTCGGTAGACTGGACG
    

    【讨论】:

    • 我也可以用两个比较字母来做吗?像sequences.loc[sequences['Sequence'].str.count('A') /sequence['Sequence'].str.len() <= 0.8 和sequence['Sequence'].str.count('T ') / 序列['序列'].str.len() <= 0.8] ?
    • @DeniseLavezzari 是的,只需使用 &amp; 而不是 and,并将您的每个条件都用大括号括起来,如下所示:( ) &amp; ( )。为了更好的优化,你可以将长度掩码保存到一个变量中,并使用这个变量而不是一次又一次地计算它:lengths = sequences['Sequence'].str.len(),然后使用... / lengths &lt;= 0.8 ...
    • (更正:lengths 不是掩码,而是数字:每个字符串的长度)
    猜你喜欢
    • 2013-06-26
    • 2022-07-21
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多