2017-06-01 13 views
1

私はこのようなシリーズを持っています: 最初の列はuser_idで、2番目の列は並べ替えられた回数= 0/1で何回を表すかのフラグです。一部のユーザーには、ユーザー21などの並べ替えがありません。 時間(0)/回(1 &)からの新しい列比率を取得したいとします。たとえば、ユーザ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このようにして生成された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であり、 .groupby(['user_id'、 'reordered'])['order_id']。count() – yanachen

+0

@yanachen何を伝えようとしていますか?あなたの目的に合うように、あなたが必要とするものを調整することができますか? – piRSquared

+0

出力はまさに私が望むものです。しかし、あなたのコードに基づいてsをdffに置き換えると、何らかのエラーが発生します。質問にエラーメッセージを貼り付けます。それを参照してください。ありがとう。 – 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']。 – yanachen

関連する問題