如何在groups.apply()。unstack()方法中的组元素上应用自定义公式?

时间:2014-10-11 20:08:09

标签: python pandas grouping

我在'Python for Data analysis'p.269

中使用了这个配方的版本
frame = DataFrame({'data1': np.random.randn(1000),
                   'data2': np.random.randn(1000)})
factor = pd.cut(frame.data1, 4)
def get_stats(group):
   return {'min': group.min(), 'max': group.max(),
           'count': group.count(), 'mean': group.mean()}
grouped = frame.data2.groupby(factor)
grouped.apply(get_stats).unstack()

Out[101]:
                count      max      mean       min
data1
(-1.23, 0.489]    598 3.260383 -0.002051 -2.989741
(-2.956, -1.23]    95 1.670835 -0.039521 -3.399312
(0.489, 2.208]    297 2.954439  0.081822 -3.745356
(2.208, 3.928]     10 1.765640  0.024750 -1.929776

在公式get_stats(group)被定义的部分中,我想要包含一个计算正面观察数量的函数,并将它们除以观察总数。所以我试过

def get_stats(group):
    return {'mean': group.mean(), 'std': group.std(),
            'hit_r': group.applymap(lambda x: x >= 0).sum() / group.count()}

但是我得到了:

AttributeError: 'Series' object has no attribute 'applymap'

如何找到将该计算合并到一个组的方法?

由于

1 个答案:

答案 0 :(得分:0)

看起来当您对数据帧进行分组时,由于您的原始文件只有两列,因此会返回一堆系列。 applymap是一个Dataframe方法,它应用方法元素。在这种情况下,您似乎正在寻找申请。请尝试以下方法......

def get_stats(group):
    return {'mean': group.mean(), 'std': group.std(),
            'hit_r': group.apply(lambda x: x >= 0).sum() / float(group.count())}

我还将group.count()作为一个浮点数,这样解释器就会意识到它需要做浮点除法而不是整数除法