我有一个元组列表,我将其转换为包含数千行的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;价值,在与蛋白质相对应的字典上。
答案 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)。
您将获得一个包含所有独特群体的新列表。
请不要忘记,如果您以后需要使用原始列表,则需要使用深度复制。