2015-05-22 136 views
1

在通過一個pandas groupby對象正確迭代時存在一個特定的問題,我還不瞭解底層動態性能夠解決我的問題。通過groupby對象正確地迭代

下面,有一個簡短的示例代碼來模擬我的問題:

import pandas as pd 
from pandas import * 
import random 

rand = np.random.RandomState(1) 
df = pd.DataFrame({'A':['foo','bar','baz']*3, 
       'B': [400,800,800,1200,400,1200,800,400,1200], 
       'C': rand.randn(9), 
       'D': rand.randint(0, 20, 9)}) 
df.head(9) 

現在我需要通過數據幀由兩列「A」和「B」分組,組迭代首先由「酒吧」,‘巴茲’和‘富C‘和‘爲曲線d’’,之後通過400,800和1200,並選擇然後從列中的值’ - 低於我嘗試用於選擇:

for k1, gp in df.groupby(['A']): 
    print '1st key =' + str(k1) 
    for k2, gp in df.groupby(['B']): 
     print '2nd key =' + str(k2) 
     print gp[['C','D']] 

產生輸出

1st key =bar 
2nd key =400 
     C D 
0 1.624345 14 
4 0.865408 17 
7 -0.761207 9 
2nd key =800 
     C D 
1 -0.611756 18 
2 -0.528172 4 
6 1.744812 13 
2nd key =1200 
     C D 
3 -1.072969 9 
5 -2.301539 0 
8 0.319039 9 
1st key =baz 
2nd key =400 
     C D 
0 1.624345 14 
4 0.865408 17 
7 -0.761207 9 
2nd key =800 
     C D 
1 -0.611756 18 
2 -0.528172 4 
6 1.744812 13 

什麼是真正接近我需要的,但C和D的值從整個數據中列出。他並沒有舉例說明'A'='bar''B'= 800的值,但'B'= 800的所有值無論列'A'中的名稱如何。

我想創建反而是一樣的東西:

1st key =bar 
2nd key =400 
     C D 
4 0.865408 17 
7 -0.761207 9 
2nd key =800 
     C D 
1 -0.611756 18 
1st key =baz 
2nd key =800 
     C D 
2 -0.528172 4 
2nd key =1200 
     C D 
5 -2.301539 
8 0.319039 

我希望,這是可能的GROUPBY對象,因爲它似乎是一個乾淨和靈活的解決方案。我也打開了一個循環的邏輯條件,但如果可能的話,我想解決它的羣體時尚。提前致謝!

回答

0

您的代碼groupby個值,那麼,對於每個這樣的價值,groupby又在發整個數據幀由B,所以這就是爲什麼你得到太多的組合。

做你想做什麼,你的雙循環應該groupby僅在第一groupby的結果B值:

for k1, gp1 in df.groupby(df.A): 
    print '1st key', k1 
    for k2, gp2 in gp1.groupby(gp1.B): 
     print '2nd key', k2 
     print gp2 

(請注意,在3號線差),其中輸出

1st key bar 
2nd key 400 
    A B   C D 
4 bar 400 0.865408 17 
7 bar 400 -0.761207 9 
2nd key 800 
    A B   C D 
1 bar 800 -0.611756 18 
1st key baz 
2nd key 800 
    A B   C D 
2 baz 800 -0.528172 4 
2nd key 1200 
    A  B   C D 
5 baz 1200 -2.301539 0 
8 baz 1200 0.319039 9 
1st key foo 
2nd key 400 
    A B   C D 
0 foo 400 1.624345 14 
2nd key 800 
    A B   C D 
6 foo 800 1.744812 13 
2nd key 1200 
    A  B   C D 
3 foo 1200 -1.072969 9 
+0

在'for'中解壓縮的元組在Python 3中仍然存在。只有函數參數簽名中的元組解開包裝才被刪除。 – BrenBarn

+0

謝謝@BrenBarn,相應更新。 –

+0

非常感謝您的努力和迄今爲止的答案。但是我還沒有看到如上面框中所示的正確選擇'C'和'D'列的數據的方法 - 如何使用密鑰k [0]和k [1]來實現這個結果? – Number42