2015-04-15 98 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。 –