2013-05-04 67 views
0
df = pd.DataFrame({'A':[11,11,22,22],'mask':[0,0,0,1],'values':np.arange(10,30,5)}) 
df 

    A mask values 
0 11 0 10 
1 11 0 15 
2 22 0 20 
3 22 1 25 

哪能組由A,並保持列名機智,卻又把自定義函數到Z:大熊貓據幀GROUPBY如MySQL,但進入新列現在

def calculate_df_stats(dfs): 

    mask_ = list(dfs['B']) 
    mean = np.ma.array(list(dfs['values']), mask=mask_).mean() 
    return mean 

df['Z'] = df.groupby('A').agg(calculate_df_stats) # does not work 

,併產生:

 A mask values Z 
0 11 0  10 12.5 
1 22 0  20 25 

無論我做什麼,它只是用蒙面的平均值替換值列。

並且您的解決方案可以應用於兩列的函數並返回一個新列嗎?

謝謝!

編輯: 澄清更多:讓我們說我有mysql的這樣一個表:

SELECT * FROM `Reader_datapoint` WHERE `wavelength` = '560' 
LIMIT 200; 

,給了我這樣的結果: http://pastebin.com/qXiaWcJq

如果我現在這樣運行:

SELECT *, avg(action_value) FROM `Reader_datapoint` WHERE `wavelength` = '560' 
group by `reader_plate_ID`; 

我得到:

datapoint_ID plate_ID coordinate_x coordinate_y res_value wavelength ignore avg(action_value) 
193 1 0 0 2.1783 560 NULL 2.090027083333334 
481 2 0 0 1.7544 560 NULL 1.4695583333333333 
769 3 0 0 2.0161 560 NULL 1.6637885416666673 

如何在Pandas中複製此行爲?請注意,所有列名稱保持不變,第一個值被採用,並添加新列。

+0

有些事情在你的問題中不清楚。 1)你的功能是什麼? (我想它必須是'mask')2)在結果數據框的'values'列中你想要什麼值? (在這個例子中,你顯示它是第一次發生的值)3)我還假設你的結果數組的'Z'列中的值25必須是20? – joris 2013-05-04 11:58:37

+0

我用更好的例子更新了這個問題。 – 2013-05-04 13:06:45

+0

好的,但是MySQL返回哪些列沒有計算(*)的值?我認爲第一次發生的行的價值?這和我的答案一樣。 什麼是'action_value'?你的意思是那裏有'res_value'? – joris 2013-05-04 13:17:41

回答

2

如果你想在你的結果原來列,可以先計算分組和彙總數據框(但你將不得不以某種方式收集您的原始列我拿了第一發生的歷史爲例):

>>> df = pd.DataFrame({'A':[11,11,22,22],'mask':[0,0,0,1],'values':np.arange(10,30,5)}) 
>>> 
>>> grouped = df.groupby("A") 
>>> 
>>> result = grouped.agg('first') 
>>> result 
    mask values 
A    
11  0  10 
22  0  20 

,然後通過在GROUPBY結果「分組」將你的函數添加一列「Z」到結果:

>>> def calculate_df_stats(dfs): 
...  mask_ = list(dfs['mask']) 
...  mean = np.ma.array(list(dfs['values']), mask=mask_).mean() 
...  return mean 
... 
>>> result['Z'] = grouped.apply(calculate_df_stats) 
>>> 
>>> result 
    mask values  Z 
A      
11  0  10 12.5 
22  0  20 20.0 

在你的函數定義,你可以隨時使用更多的列(只是他們的名字)返回結果。