数据帧列的一个元素和所有其他元素之间的比较

2024-04-20 03:31:55 发布

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

我有一个元组列表,我把它变成了一个包含数千行的数据帧,如下所示:

                                          frag         mass  prot_position
0                               TFDEHNAPNSNSNK  1573.675712              2
1                                EPGANAIGMVAFK  1303.659458             29
2                                         GTIK   417.258734              2
3                                     SPWPSMAR   930.438172             44
4                                         LPAK   427.279469             29
5                          NEDSFVVWEQIINSLSALK  2191.116099             17
...

我有以下规则:

def are_dif(m1, m2, ppm=10):
    if abs((m1 - m2) / m1) < ppm * 0.000001:
        v = False
    else:
        v = True
    return v

所以,我只想要质量不同于其他碎片质量的碎片。我怎样才能做到“选择”?你知道吗

然后,我有一个名为“pinfo”的列表,其中包含:

d = {'id':id, 'seq':seq_code, "1HW_fit":hits_fit}
# one for each protein
# each dictionary as the position of the protein that it describes.

所以,我想把1和蛋白质对应的字典上的“hits\u fit”值相加。你知道吗


Tags: theid列表质量positionseqfit碎片
3条回答

这里有一个和你要求的略有不同的东西,但它非常简单,我认为会产生类似的效果。你知道吗

使用^{},可以创建一个新列

import numpy as np

df['roundedMass'] = np.round(df.mass, 6)

在那之后,你可以做一个groupby的碎片对圆形的质量,并使用nunique来计算组中的数字。筛选大小为1的组。你知道吗

所以,每个箱子的碎片数是:

df.frag.groupby(np.round(df.mass, 6)).nunique()

如果我理解正确(不确定是否正确),你可以通过分类来完成相当多的工作。不过,首先,让我调整数据,使其混合了近距离和远距离的质量值:

   Unnamed: 0                 frag         mass  prot_position
0           0       TFDEHNAPNSNSNK  1573.675712              2
1           1        EPGANAIGMVAFK  1573.675700             29
2           2                 GTIK   417.258734              2
3           3             SPWPSMAR   417.258700             44
4           4                 LPAK   427.279469             29
5           5  NEDSFVVWEQIINSLSALK  2191.116099             17

然后我想你可以做如下的事情来选择“好”的。首先,创建“pdiff”(百分比差异)以查看质量与最近邻居的距离:

ppm = .00001
df = df.sort('mass')

df['pdiff'] = (df.mass-df.mass.shift()) / df.mass

   Unnamed: 0                 frag         mass  prot_position         pdiff
3           3             SPWPSMAR   417.258700             44           NaN
2           2                 GTIK   417.258734              2  8.148421e-08
4           4                 LPAK   427.279469             29  2.345241e-02
1           1        EPGANAIGMVAFK  1573.675700             29  7.284831e-01
0           0       TFDEHNAPNSNSNK  1573.675712              2  7.625459e-09
5           5  NEDSFVVWEQIINSLSALK  2191.116099             17  2.817926e-01

第一行和最后一行的数据使这一点有点棘手,所以下一行将回填第一行并重复最后一行,以便下面的掩码正常工作。这在这里的示例中是有效的,但在其他情况下可能需要调整(但仅限于第一行和最后一行数据)。你知道吗

df = df.iloc[range(len(df))+[-1]].bfill()
df[ (df['pdiff'] > ppm) & (df['pdiff'].shift(-1) > ppm) ]

结果:

   Unnamed: 0                 frag         mass  prot_position     pdiff
4           4                 LPAK   427.279469             29  0.023452
5           5  NEDSFVVWEQIINSLSALK  2191.116099             17  0.281793

对不起,我完全不明白问题的第二部分。你知道吗

编辑添加:正如@AmiTavory答案的评论中所提到的,我认为排序方法和分组方法可以结合起来,得到比这个更简单的答案。我可能会在以后的时间尝试,但每个人都应该自由地给自己一个机会,如果有兴趣。你知道吗

另一种解决方案是创建列表的dup(如果您需要保留它以便以后进一步处理),遍历它并删除所有与规则(m1&m2)不对应的元素。你知道吗

您将得到一个包含所有唯一质量的新列表。你知道吗

只是别忘了,如果以后确实需要使用原始列表,那么就需要使用deepcopy。你知道吗

相关问题 更多 >