如何计算groupby后大熊猫系列的比例?

时间:2017-06-01 06:48:52

标签: pandas

我有一个这样的系列: 第一列是user_id,第二列是表示重新排序的次数= 0/1的标志。一些用户没有重新排序,例如,用户21。 我想得到一个新的列比率,它是从时间(0)/次(1& 0)。 例如,对于用户1,比率是1 /(1 + 10)。我怎么能这样做。

user_id  reordered
1        0.0           1
         1.0          10
15       0.0           1
         1.0           4
19       0.0           1
         1.0           2
21       0.0           1
31       0.0           1
         1.0           1
43       0.0           1
         1.0           1
52       0.0           1
         1.0          13
67       0.0           1
         1.0          19
81       0.0           1
         1.0           1
82       0.0           1
         1.0           8
98       0.0           1
         1.0           6
109      0.0           1
120      0.0           1
         1.0           1
185      0.0           1

enter image description here

2 个答案:

答案 0 :(得分:3)

(dff.xs(0, level='reordered') / dff.groupby(level='user_id').sum()).rename('ratio')

user_id
1      0.090909
15     0.200000
19     0.333333
21     1.000000
31     0.500000
43     0.500000
52     0.071429
67     0.050000
81     0.500000
82     0.111111
98     0.142857
109    1.000000
120    0.500000
185    1.000000
Name: ratio, dtype: float64

答案 1 :(得分:1)

<强>设置

diff
user_id  reordered
1        0             1
         1            10
15       0             1
         1             4
19       0             1
         1             2
21       0             1
31       0             1
         1             1
43       0             1
         1             1
52       0             1
         1            13
67       0             1
         1            19
81       0             1
         1             1
82       0             1
         1             8
98       0             1
         1             6
109      0             1
120      0             1
         1             1
185      0             1

<强>解决方案

#group by userid, sum count on 0s and then divide by sum of all.
diff.name = 'count'    
diff.reset_index().groupby('user_id').apply(lambda x: x[x.reordered==0]['count'].sum()/float(x['count'].sum()))

user_id
1      0.090909
15     0.200000
19     0.333333
21     1.000000
31     0.500000
43     0.500000
52     0.071429
67     0.050000
81     0.500000
82     0.111111
98     0.142857
109    1.000000
120    0.500000
185    1.000000
dtype: float64