2017-02-12 6 views
3

のは、私は、次のデータフレームがあると仮定してみましょう:このデータフレームに基づいてデータフレームに固有の値に基づいて、多数の列を生成

user_id | a1 | a2 | a3 | a4 | a5 | ... | a100 
1  | 12 | 30 | 0 | 12 | 1 | ... | 21 
2  | 2 | 13 | 18 | 13 | 13 | ... | 3 
3  | 42 | 31 | 5 | 14 | 26 | ... | 41 
4  | 1 | 9 | 10 | 15 | 20 | ... | 23 

を、私は、のいずれかのユニークな値のための追加列を生成したいですa1-a100の列。私は例を挙げてこれを説明する方が良いと思います。上記データフレームに基づいて、私は、元のデータフレームに付加され、次の列だろう:例えば

1AndAbove | 2AndAbove | ... | 42AndAbove 
5   | 4   | ... | 0 
6   | 6   | ... | 0 
6   | 6   | ... | 2 
6   | 5   | ... | 0 

を42AndAbove列の値のみが第3ユーザが42に等しい値とグレータを有することを示し、それは2度持っています。

私は、次のコードを使用していずれかで、このいずれかを行うことができる午前:

df['1AndAbove'] = (df > 1).astype(int).sum(axis=1) 

私は100列を生成する必要がある場合は、これは非常に面倒です。これを行うためのより一般的でエレガントな方法があるのだろうか?

+1

あなたができるはずですが、簡単にループの中でそれを行う、わからない、それを行うためのベクトル化方法があれば。 – Zero

+0

@JohnGalt以下のベクター化された方法 – Boud

答えて

3

IIUICを使用すると、最初にa*の列をフィルタリングし、1-2の値の範囲をループすることができますか?ここで結果

In [386]: df 
Out[386]: 
    user_id a1 a2 a3 a4 a5 a100 1AndAbove 2AndAbove 3AndAbove \ 
0  1 12 30 0 12 1 21   5   4   4 
1  2 2 13 18 13 13  3   6   6   5 
2  3 42 31 5 14 26 41   6   6   6 
3  4 1 9 10 15 20 23   6   5   5 

     ...  33AndAbove 34AndAbove 35AndAbove 36AndAbove 37AndAbove \ 
0  ...    0   0   0   0   0 
1  ...    0   0   0   0   0 
2  ...    2   2   2   2   2 
3  ...    0   0   0   0   0 

    38AndAbove 39AndAbove 40AndAbove 41AndAbove 42AndAbove 
0   0   0   0   0   0 
1   0   0   0   0   0 
2   2   2   2   2   1 
3   0   0   0   0   0 

[4 rows x 49 columns] 
+0

ありがとう、あなたがコメントした後、私はちょっと考え出しました! – renakre

2

In [382]: df_a = df.filter(like='a') 

In [385]: for x in range(1, 43): 
    ...:  df['%sAndAbove' % x] = (df_a >= x).sum(axis=1) 
    ...: 

はそれを行うためのベクトル化の方法です:

pd.get_dummies(df.stack()).sum(level=0).iloc[:,::-1].cumsum(axis=1).iloc[:,::-1] 
Out[83]: 
     0 1 2 3 5 9 10 12 13 14 15 18 20 21 23 26 30 \ 
user_id                  
1   6 5 4 4 4 4 4 4 2 2 2 2 2 2 1 1 1 
2   6 6 6 5 4 4 4 4 4 1 1 1 0 0 0 0 0 
3   6 6 6 6 6 5 5 5 5 5 4 4 4 4 4 4 3 
4   6 6 5 5 5 5 4 3 3 3 3 2 2 1 1 0 0 

     31 41 42 
user_id    
1   0 0 0 
2   0 0 0 
3   3 2 1 
4   0 0 0 
+0

それはダミーの良い使用です!きちんとした – Zero

+0

ニース!非常に興味深い解決策! – MaxU

関連する問題