2013-05-28 71 views
2

我有一個非常大的數據框,我想做一些重組明智的比較。作爲一個例子讓我們在下面的示例:熊貓:有效的方式來做與groupby對象的循環

df = pd.DataFrame({'A': ['foo', 'bar'] * 3, 
       'B': ['me', 'you', 'me'] * 2, 
       'C': [5, 2, 3, 4, 6, 9]}) 

現在我想通過這些團體由列A組,有效地循環,使排兩比較的方式如下:

gb = df.groupby(['A']) 

for k, gp in gb: 
    for i in arange(len(gp['C'])): 
     sum = 0 
     for j in arange(len(gp['C'])): 
      if (i != j): 
       sum = sum + gp['C'].irow(j) 
     print gp['C'].irow(i) - sum 

有可以更高效地執行此操作,並將其結果分配給Dataframe中的單獨列。

我會非常感激你的幫助

安迪

回答

3

這似乎有點怪我,但IIUC,你的輸出由

df["weird_C"] = 2*df["C"] - df.groupby("A")["C"].transform(np.sum) 

給出例如:

>>> df = pd.DataFrame({'A': ['foo', 'bar'] * 3, 
       'B': ['me', 'you', 'me'] * 2, 
       'C': [5, 2, 3, 4, 6, 9]}) 
>>> df 
    A B C 
0 foo me 5 
1 bar you 2 
2 foo me 3 
3 bar me 4 
4 foo you 6 
5 bar me 9 
>>> df["weird_C"] = 2*df["C"] - df.groupby("A")["C"].transform(np.sum) 
>>> df 
    A B C weird_C 
0 foo me 5  -4 
1 bar you 2  -11 
2 foo me 3  -8 
3 bar me 4  -7 
4 foo you 6  -2 
5 bar me 9  3 

Basica lly,在pandas中,事情效果更好,你可以在快速向量化C中做得更好。在這種情況下,我們可以一次取得總和,然後減去我們添加的額外位數,而不是循環遍歷組成員:

>>> df.groupby("A")["C"].sum() 
A 
bar 15 
foo 14 
Name: C, dtype: int64 

更妙的是,我們可以使用transform,使廣播會給我們一個系列組款項:

>>> df.groupby("A")["C"].transform(np.sum) 
0 14 
1 15 
2 14 
3 15 
4 14 
5 15 
Name: C, dtype: int64 

,然後因爲我們有總集團和我們真正想要的區別每個值和其他值,我們可以將「x-rest」看作「x + x - x - rest」或者「x + x - (total)」或者「2 * x - total」:

>>> 2*df["C"] - df.groupby("A")["C"].transform(np.sum) 
0 -4 
1 -11 
2 -8 
3 -7 
4 -2 
5  3 
Name: C, dtype: int64 
+0

嗨帝斯曼,非常感謝您的幫助。對困惑感到抱歉。計算方式只是一個例子。實際上,在我需要做計算的行中有對象。你會爲這個特殊情況推薦什麼? – Andy