pandas groupby并更新一列中的值大于另一列的次数之和

时间:2018-03-08 22:45:37

标签: python pandas pandas-groupby

我有以下格式的数据集

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

但我无法实现它。

我如何获得所需的结果?

1 个答案:

答案 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上分组,然后输入总和以获得结果。