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中复制此行为?请注意,所有列名称保持不变,第一个值被采用,并添加新列。
有些事情在你的问题中不清楚。 1)你的功能是什么? (我想它必须是'mask')2)在结果数据框的'values'列中你想要什么值? (在这个例子中,你显示它是第一次发生的值)3)我还假设你的结果数组的'Z'列中的值25必须是20? – joris 2013-05-04 11:58:37
我用更好的例子更新了这个问题。 – 2013-05-04 13:06:45
好的,但是MySQL返回哪些列没有计算(*)的值?我认为第一次发生的行的价值?这和我的答案一样。 什么是'action_value'?你的意思是那里有'res_value'? – joris 2013-05-04 13:17:41