我有以下格式的数据集
df = pd.DataFrame([[1, 'Label1', 0, 8, 2], [1, 'Label3', 0, 20, 5], [2, 'Label5', 1, 20, 2], [2, 'Label4', 1, 11, 0],
[5, 'Label2', 0, 0, -4],[1, 'Label2', 1, 8, 2], [2, 'Label5', 0, 20, 5], [3, 'Label2', 1, 20, 2], [4, 'Label4', 0, 1, 0],
[5, 'Label3', 0, 1, -4],[1, 'Label3', 1, 8, 2], [2, 'Label4', 0, 20, 5], [3, 'Label1', 1, 20, 2], [4, 'Label3', 0, 1, 0],
[5, 'Label4', 0, 1, -4],[1, 'Label4', 1, 8, 2], [2, 'Label3', 0, 20, 5], [3, 'Label3', 1, 20, 2], [4, 'Label5', 0, 1, 0],
[5, 'Label5', 0, 1, -4]],
columns=['ID', 'Label', 'Status', 'Coeff', 'result'])
cm = {'TP': 0,'FP': 0}
对于df中的每个ID
,我想查找当Coeff
列为1时,列Result
大于Status
的次数。如果计数大于3,则TP
应增加1,如果小于3,则FP
应增加1.
示例:当ID
为1111且Status
为1时,如果Coeff
列的特定ID大于Result
列两次,则FP必须增加1.
我尝试为每个ID添加一个名为count的新列,并在每次列Coeff
大于Result
时将值指定为1。
for ID in df.groupby('ID'):
df.loc[(df['Coeff'] > df['Result']), 'count'] = 1
df_new = list(df[['ID','count']].groupby(df['ID']))
然后我想到找出count
中是否有数字1。如果是,则递增TP
。否则,请增加FP
。
但我无法实现它。
我如何获得所需的结果?
答案 0 :(得分:1)
对屏蔽比较的简单分组操作应该:
v = df.Coeff.gt(df.result).where(df.Status.astype(bool)).groupby(df.ID).sum()
或(保留dtype=int
,谢谢piR!),
v = df.Coeff.gt(df.result).where(df.Status.astype(bool), 0).groupby(df.ID).sum()
v # second expression result
ID
1 3
2 2
3 3
4 0
5 0
dtype: int64
现在,
cm['TP'] = v.gt(3).sum()
cm['FP'] = v.lt(3).sum()
详细
df.Coeff.gt(df.result)
返回一个掩码。现在,隐藏df.Status
不是1的所有值。这是使用(df.Coeff > df.result).where(df.Status.astype(bool))
完成的。最后,获取此屏蔽结果,并在ID
上分组,然后输入总和以获得结果。