2017-07-03 12 views
0

私は、多くのカラムを持つ顧客注文を表すデータフレームを持っています。それらのうちの2つは 'user_id'と 'dollar'です。例えばZscore groupbyを使用してDataframeのカラムを正規化する

user_id dollar 
0 1 0.34592 5 
1 1 0.02857 7 
2 1 0.26672 6 
3 1 0.34592 5 
4 1 0.02857 9 
5 1 0.26672 10 
6 1 0.34592 6 
     [...] 
7 40 0.02857 20 
8 40 0.26672 19 
9 40 0.34592 8 
10 40 0.02857 18 
11 40 0.26672 26 

私は、各ユーザの行の他の値に対するドルの値を正規化します。私は以前、たとえば次のような結果が欲しい:

user_id dollar norm_dollar 
0 1 0.34592 5 -1.02774024 
1 1 0.02857 7 0.07905694 
2 1 0.26672 6 -0.47434165 
3 1 0.34592 5 -1.02774024 
4 1 0.02857 9 1.18585412 
5 1 0.26672 10 1.73925271 
6 1 0.34592 6 -0.47434165 
     [...] 
7 40 0.02857 20 0.7787612 
8 40 0.26672 19 0.57109154 
9 40 0.34592 8 -1.71327463 
10 40 0.02857 18 0.36342189 

EDIT:

私はuser2のと、たとえば、それぞれの結果は、個別にではなく、全体の列の値が、各ユーザの正規化WRTになりたいそうです、 [20,19,8,18]は、meanがuser2注文の平均であるかのように正規化する必要があります。たとえば、平均は16,25であり、データフレーム列全体の平均ではありません。

私は一人のユーザーでそれを行う方法を知っている:

user1 = data.loc[data['user_id']==1] 
data.loc[data['user_id']==1]['norm_dollar'] = sp.stats.mstats.zscore(user1['dollar']) 

私は、すべてのユーザーのために、このようにそれを実行しようとしました:

data.dollar.div(sp.stats.mstats.zscore(data.groupby('user_id').dollar)) 

しかし、私はエラーを得た、あなたがいずれかを持っていますどのように進行するかについてのアイデア?

はあなたにこのようなバックへgroupbyデータフレームを結合し、元の-が、私はこのようなもののためにtransformの使用を好きになり始めていますを行うには

答えて

1

さまざまな方法をありがとうございました。

構文はまだ冗長ですが、結合方法よりも読みやすいと思います。あなたはnp.std上の自由度を指定する必要がある場合

df['norm_dollar'] = (df['dollar'] 
         - df.groupby('user_id')['dollar'].transform(np.mean)) \ 
         /df.groupby('user_id')['dollar'].transform(np.std) 

、あなたはあなたのために働くべきであると

lambda x: np.std(x, ddof=n) 
1

にそれを回すことができます。

def apply_zscores(x): 
    x['norm_dollar'] = zscore(x['dollar']) 
    return x 

df = df.groupby('id').apply(lambda x: apply_zscores(x)) 
関連する問題