【问题标题】:How do I split string into characters and replace characters with float values to find the sum of original string in Python?如何将字符串拆分为字符并用浮点值替换字符以在 Python 中找到原始字符串的总和?
【发布时间】:2020-12-10 17:13:24
【问题描述】:

嗨,

这里是python的新手。

我有超过 10,000 个表示肽序列的字符串。字符串中的每个字母都是一个氨基酸,我想在用预定义的浮点值(范围从 -1 到 -2)替换每个字母后计算字符串的“净总和”。

我被困在从哪里开始循环以使其工作?我有清理字符串的代码,以便删除非字母字符并替换为字典中定义的浮点值(即 W:2.10,G:-1.0)

清理过的肽段,截断为 5 个字符

我想代码是这样的。

我有 6 个数据框可以重复这个过程。

任何帮助将不胜感激!

更新的代码(感谢 SARAH MESSER)

def hydrophobicity_score(peptide):
    hydro = { 
        'A': -0.5,
        'C': -1.0,
        'D': 3.0,
        'E': 3.0,
        'F': -2.5,
        'G': 0.0,
        'H': -0.5,
        'I': -1.8,
        'K': 3.0,
        'L': -1.8,
        'M': -1.3,
        'N': 0.2,
        'P': 0.0,
        'Q': 0.2,
        'R': 3.0,
        'S': 0.3,
        'T': -0.4,
        'V': -1.5,
        'W': -3.4,
        'Y': -2.3,
    }
    hydro_score = [hydro.get(aa,0.0)for aa in peptide]
    return sum(hydro_score)

og_pep['Hydro'] = og_pep['Peptide'].apply(hydrophobicity_score)
og_pep

【问题讨论】:

  • 当您转换为浮点值时,这些值是否在列表中?它们是float 类型的吗?
  • 您能否提供输入的 sn-p(3-5 个元素)以及相应的所需输出是什么?也许还有你的数据框列的名称和 dtypes - 或者至少是这个转换中涉及的那些?
  • 为什么你的循环不使用peptide 变量?但是,通常不需要编写循环来处理 Pandas 系列中的所有行。
  • 你有字母与浮点数相关性的字典吗?
  • 您应该有一个函数,该函数采用单个截断的肽序列并在对所有行执行此操作之前对该单个序列求和。你有吗?

标签: python pandas loops


【解决方案1】:

好的,首先,您不想循环遍历数据框中的行。这些行被设计为并行处理。解决这个问题有点牵强,但是一旦您定义了一些行级操作并将它们应用于大型数据帧,它就会变得更加平滑。 (循环行的问题是速度之一。它有时在调试或玩具问题中很有用,但现代计算硬件试图尽可能地并行计算。数据帧利用这一点来处理所有行,而不是在循环中单独处理它们。)

要进行转换,您需要定义一个自定义函数来对每一行进行操作。然后将该自定义函数传递给数据框,并告诉apply 将该行级函数传递给一列,以生成新列。

所以这里有一个可能的函数来帮助你开始:

def peptide_score(peptide_string):
    '''Returns a numerical score given a sequence of peptide characters.'''
    # Replace the values in this dict (dictionary / map) with whatever values you need
    amino_acid_scores = { 
        'A': 0.1,
        'C': 1.4,
        'G': 0.32342,
        'T': -0.23,
        'U': 74.22
    }
    # This is called a "list comprehension." It's great for transforming sequences.
    score_list = [amino_acid_scores[character] for character in peptide_string]
    return sum(score_list)

# I'm assuming your pre-existing dataframe is called "gluc_dataframe" and that the
# column with your strings is called "Peptide".  Output scores will be stored in a new
# column, "score". Replace those names with whatever fits.
gluc_dataframe['score'] = gluc_dataframe['Peptide'].apply(peptide_score)

如果您有很多要忽略的字符(空格、标点符号等),您可以将列表推导中的 amino_acid_scores[character] 替换为 amino_acid_scores.get(character, 0.0)

【讨论】:

  • 美丽。非常感谢。这就是我设想@Barmar 的答案的方式。完成后我会发布结果。
  • 这实际上很棒,因为我可以在将数据拆分为 6 个数据帧之前完成此操作。
  • 我没有得到这个答案。我将在单独的答案中发布更新。
  • 当你尝试这个时会发生什么?
  • 我错过了关于忽略(无论如何)的部分。它试图列出理解标点符号。
【解决方案2】:
def hydrophobicity_score(peptide):
     hydro = { 
        'A': -0.5,
        'C': -1.0,
        'D': 3.0,
        'E': 3.0,
        'F': -2.5,
        'G': 0.0,
        'H': -0.5,
        'I': -1.8,
        'K': 3.0,
        'L': -1.8,
        'M': -1.3,
        'N': 0.2,
        'P': 0.0,
        'Q': 0.2,
        'R': 3.0,
        'S': 0.3,
        'T': -0.4,
        'V': -1.5,
        'W': -3.4,
        'Y': -2.3,
    }
    hydro_score = [hydro[aa] for aa in peptide]
    return sum(hydro_score)

og_peptide= og_pep['Peptide']
og_peptide = og_peptide.str.replace('\W+','')
og_peptide = og_peptide.str.replace('\d+','')
og_peptide = pd.DataFrame(og_peptide)
og_peptide['Hydro_Score'] = og_peptide.apply(hydrophobicity_score)
og_peptide

我没有得到预期的输出。

Output

Here is og_pep DataFrame

【讨论】:

  • 您将函数应用于数据框,而不是系列。因此,您列出了对 DF 中的值的理解循环,而不是单个字符串中的字符。
  • 知道了,谢谢。我已经更新了原始帖子中的代码以显示正确答案。
猜你喜欢
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 2011-05-23
相关资源
最近更新 更多