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:
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 :(得分: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
在函数定义中,您始终可以使用更多列(仅按名称)来返回结果。