通过计算特殊元素来聚合DataFrame列

时间:2014-07-03 14:26:11

标签: python pandas

我有以下格式的DataFrame b

   chip sampleid  WL     ok
0     1     test   4   True
1     2     test   4  False

如果我想计算b['ok']中True元素的数量,我可以运行:

In [125]: sum(b['ok'])
Out[125]: 1

我现在想要按sampleid对此DataFrame进行分组,并计算ok列中的筹码以及True元素的数量。

In [121]: c = b.groupby('sampleid', as_index=False).aggregate({'chip': lambda x: len(x.unique()), 'ok': sum})

In [122]: c
Out[122]:
  sampleid  chip    ok
0     test     2  True

为什么这种行为与上述不同?如何计算列中的元素?预期的输出是:

  sampleid  chip    ok
0     test     2     1

1 个答案:

答案 0 :(得分:0)

这显然是一个错误,aggregate会尝试将结果转换为原始dtype所具有的DataFrame。此处sum将返回1bool(1)将返回True。如果ok中的两个值均为False s,则结果为Falsebool(0))。进一步的例子:

In [85]:

print df.groupby('sampleid', as_index=False).aggregate({'chip': lambda x: len(x.unique()), 
                                                        'ok': lambda x: np.mean(x)})
  sampleid  chip   ok
0     test     2  0.5 #somehow if a float(?) is returned, converting doesn't happen , despite of bool(0.5)==True 
In [87]:

print df.groupby('sampleid', as_index=False).aggregate({'chip': lambda x: len(x.unique()), 
                                                        'ok': lambda x: np.ptp(x)})
  sampleid  chip    ok
0     test     2  True #np.ptp() will return 1 and bool(1)==True