groupby上的熊猫cumsum表现不尽如人意

时间:2016-07-21 17:37:34

标签: python pandas

我有一个这样的数据框:

df = pd.DataFrame({'prob':np.random.uniform(0,1,size), 'target':np.random.randint(0,2, size=size), 
              'pred':np.random.randint(0,2, size=size)})

我想计算cumsum groupby qcut的{​​{1}}:

df['box'] = pd.qcut(df['prob'], 10)

我的期望是按顺序计算每个组的累积函数,而是计算每个元素的总和:

df['target_1'] = 1- df['target']
ch_curve = df.groupby('box').target.cumsum()/float(df.target.sum())
nch_curve = df.groupby('box').target_1.cumsum()/float(df.target_1.sum())

带答案

0     0.000000
1     0.018182
2     0.018182
3     0.018182
4     0.000000
5     0.018182
6     0.018182
7     0.018182
8     0.036364
9     0.018182
10    0.000000
11    0.018182
12    0.018182
13    0.036364
14    0.000000
15    0.036364
16    0.036364
17    0.036364
18    0.054545
19    0.000000
20    0.000000
21    0.018182
22    0.018182
23    0.05454

而不是

'(0.0, 0.1)'    0.04
'(0.1, 0.2)'    0.12 #(0.08 + previous 0.04 )
'(0.2, 0.3)'    0.17 #(0.05 + previous 0.12 )

1 个答案:

答案 0 :(得分:4)

您想要计算每个组的百分比,然后然后计算cumsum。

在您的原始代码中,df.groupby('box').target.cumsum()会占用每个组的cumsum - 因此您将为分组的DataFrame中的每个元素分配一个元素。然后,该部门将在所有这些元素中播出。

相反,您希望为每个组获取一个摘要统计信息,然后将cumsum与这些统计信息相对应。

ch_curve = (df.groupby('box').target.sum() / df.target.sum()).cumsum()
nch_curve = (df.groupby('box').target_1.sum() / df.target_1.sum()).cumsum()