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に入れるにはどうすればよいですか。

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

パンダでこの動作を再現するにはどうすればよいですか? すべての列名は同じままで、最初の値が取得され、新しい列が追加されることに注意してください。

4

1 に答える 1

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 の結果 'grouped' に関数を適用して、その結果に列 '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

関数定義では、結果を返すためにいつでも (名前だけで) より多くの列を使用できます。

于 2013-05-04T12:15:01.960 に答える