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
私が何をしても、値の列をマスクされた平均に置き換えるだけです。
また、ソリューションを 2 つの列の関数に適用して、新しい列に戻すことはできますか?
ありがとう!
編集: さらに明確にするために: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
パンダでこの動作を再現するにはどうすればよいですか? すべての列名は同じままで、最初の値が取得され、新しい列が追加されることに注意してください。