2017-06-01 67 views
1

我有这样一个系列: 第一列是user_id,第二列是一个标志,表示reordered = 0/1中的次数。某些用户没有重新排序,例如,用户21. 我希望获得新的列比率,这是从次数(0)/次(1 & 0)。例如,对于用户1,比率是1 /(1 + 10)。我怎样才能做到这一点。如何计算groupby之后熊猫系列的比例?

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

+0

我系列的名称i s dff它以这种方式生成dff = df.groupby(['user_id','reordered'])['order_id']。count() – yanachen

回答

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 
+0

我的系列的名字是dff,它以这种方式生成dff = df .groupby(['user_id','reordered'])['order_id']。count() – yanachen

+0

@yanachen你想告诉我什么。你能调整你需要的东西来满足你的目的吗? – piRSquared

+0

输出正是我想要的。但是当我用你的代码替换掉dff时,会出现一些错误。并在问题中粘贴错误消息。 Plz看到它。谢谢。 – yanachen

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 
+0

我的系列名称是dff,它以这种方式生成dff = df.groupby(['user_id','reordered'])['order_id']。count() – yanachen