DataFrame列

时间:2015-05-31 16:09:10

标签: python pandas

我有一个元组列表,我将其转换为包含数千行的DataFrame,如下所示:

                                          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

所以,我只想要那些质量与所有其他碎片质量不同的碎片。我怎样才能实现&#34;选择&#34;?

然后,我有一个名为&#34; pinfo&#34;的列表包含:

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加到&#34; hits_fit&#34;价值,在与蛋白质相对应的字典上。

3 个答案:

答案 0 :(得分:2)

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

   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

然后我认为你可以做以下的事情来选择&#34;好&#34;那些。首先,创建&lt; pdiff&#39; (差异百分比)看看质量与最近邻居有多接近:

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的回答评论中提到的那样,我认为可能会将排序方法和groupby方法结合起来,以获得比此更简单的答案。我可能会在以后尝试,但是如果有兴趣的话,每个人都应该自己动手。

答案 1 :(得分:1)

这里的内容与你提出的内容略有不同,但它非常简单,我认为会产生类似的效果。

使用numpy.round,您可以创建新列

import numpy as np

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

然后,您可以在圆形质量上执行groupby个frags,并使用nunique计算组中的数字。过滤大小为1的组。

因此,每个垃圾箱的碎片数量为:

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

答案 2 :(得分:0)

另一个解决方案是创建列表的副本(如果您需要保留它以便以后进一步处理),迭代它并删除所有与您的规则不对应的元素(m1和m2)。

您将获得一个包含所有独特群体的新列表。

请不要忘记,如果您以后需要使用原始列表,则需要使用深度复制。