我有以下格式的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
答案 0 :(得分:0)
这显然是一个错误,aggregate
会尝试将结果转换为原始dtype
所具有的DataFrame
。此处sum
将返回1
,bool(1)
将返回True
。如果ok
中的两个值均为False
s,则结果为False
(bool(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