pandas dataframe groupby喜欢mysql,但还是进入了新专栏

时间:2013-05-04 06:29:50

标签: python group-by pandas dataframe

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中复制此行为?请注意,所有列名称保持不变,第一个值,并添加新列。

1 个答案:

答案 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

在函数定义中,您始终可以使用更多列(仅按名称)来返回结果。