2015-04-15 65 views
-1
PROT  PEP  SD 
1  XXX  4,54    
1  XXX  5,56    
1  XXY  4,67      
1  XXZ  5,67    
1  XXY  5,67 
1  XXX  5,68   
2  XXW  4,64    
2  XXZ  4,54    
2  XXW  5,56    
2  XXX  4,67       
2  XXX  5,67 

我需要找出一种方法,通过prot和pep过滤数据,但只保留pep,其中有超过1个pep的prot - >,然后再次过滤以便每个pep值只有2最高SD保持(和总结这两个/除以2)为PROT1筛选,分组数据

输出:

PROT PEP SD 
1  XXX 5.56+5.68 /2 
     XXY 4.67 + 5.67 /2 

我想这可能是这样,如果我弄清楚拉姆达X后放什么:所以它需要三个最高价值,现在它给了我一个最高价值指数。

counts = (df6.groupby(['PROT','PEP])['SD'] 
     .apply(lambda x: x.idxmax())) 
+2

与[上一个问题](http://stackoverflow.com/questions/29636451/grouping-and-filtering-data)有什么不同?此外,接受答案的答案很常见,答案的左上方会有一个空的刻度标记。 – EdChum

+0

不同的是,另一个我自己做错了。我试图修改它,但没有成功。另一个是 - 前两个pep,但这个是所有pep(以及所有这些都发生超过一次),但是前3个SD值不是前3个PEP值。在我看到你的评论之前,我刚好在30秒之前就明白了接受的事情。抱歉。 – Maku

+0

不用担心,不知道为什么有人低调,但也许你需要显示你已经尝试过,为什么你的努力不会产生你想要的东西 – EdChum

回答

2

我会忍不住要做到这一点在单次:

In [11]: g = df.groupby(['PROT', 'PEP']) 

In [12]: g['SD'].apply(lambda x: np.nan if len(x) < 2 else (x.nlargest(2).sum()/2)) 
Out[12]: 
PROT PEP 
1  XXX 5.62 
     XXY 5.17 
     XXZ  NaN 
2  XXW 5.10 
     XXX 5.17 
     XXZ  NaN 
Name: SD, dtype: float64 

,然后删除NaN的。再次

In [21]: g = df.groupby(['PROT', 'PEP']) 

In [22]: g.filter(lambda x: len(x) >= 2) 
Out[22]: 
    PROT PEP SD 
0  1 XXX 4.54 
1  1 XXX 5.56 
2  1 XXY 4.67 
4  1 XXY 5.67 
5  1 XXX 5.68 
6  2 XXW 4.64 
8  2 XXW 5.56 
9  2 XXX 4.67 
10  2 XXX 5.67 

过滤器,以便:通过PROT打气,但只保留PEP那里有超过1个PEP为PROT

使用GROUPBY过滤


过滤数据对于每个pep值,只有2个最高SD保留(并且将这两个/除以2)

您可以在第二次使用时使用nlargest,但这会变得杂乱无章。

In [31]: (g.filter(lambda x: len(x) >= 2) 
      .groupby(['PROT', 'PEP'])['SD'] 
      .nlargest(2) 
      .groupby(level=[0, 1]) 
      .sum()/2) 
Out[31]: 
PROT PEP 
1  XXX 5.62 
     XXY 5.17 
2  XXW 5.10 
     XXX 5.17 
dtype: float64 

我认为我们可以同意最好的方法是更清晰(和更高效!)。

+0

谢谢你做的伎俩!但是在它是一个数据框之前,现在如果我只想再次将蛋白质组作为g.groupby('PROT')。mean(),它将不会起作用,它不再是表格格式。 – Maku

+0

使用'.groupby(level ='PROT')'或'.reset_index()'使其成为一个DataFrame。 –