2017-12-26 23 views
2

私はPython &パンダを使い始めました。私はGoogleを検索し、私の質問への答えのためにスタックオーバーフローが1つを見つけることができませんでした。列内のすべての値についていくつかの条件を確認してください。

人1人あたりのデータ行数が複数あるdfとresponse_goという変数があります。この変数は1または0(int64型)にコーディングすることができます。一人あたり480行...)今

ID response_go 
0 1  1 
1 1  0 
2 1  0 
3 1  1 
4 2  1 
5 2  0 
6 2  1 
7 2  1 

との双方向大きな、私は、response_goのエントリが個別にすべて0をコード化しているかどうかを各ID /人のためにチェックしたいすべての1、またはどちらも(他の条件をコード化)。これまでのところ、私はこれが出ている:

ids = df['ID'].unique() 

    for id in ids: 
     if (df.response_go.all() == 1): 
      print "ID:",id,": 100% Go" 
     elif (df.response_go.all() == 0): 
      print "ID:",id,": 100% NoGo" 
    else: 
     print "ID:",id,": Mixed Response Pattern" 

しかし、それは私に次のような出力が得られます。

ID: 1 : 100% NoGo 
ID: 2 : 100% NoGo 
ID: 2 : Mixed Response Pattern 

(両方のもの&ゼロが含まれているとして)それがあるべきとき

ID: 1 : Mixed Response Pattern 
ID: 2 : Mixed Response Pattern 

この質問に以前に尋ねられたかもしれないが、回答を探すときに本当に申し訳ありませんが、私は本当にこの問題を解決することはできませんでした。これまでにこれが答えられた場合は、解決策を教えてください。みんなありがとう!!!!心から感謝する! (異なるデータを持つ)

+0

これは良い質問ですが、より多くのupvotesに値します。 – RoadRunner

答えて

2

サンプル -

df = pd.DataFrame({'ID' : [1] * 3 + [2] * 3 + [3] * 3, 
        'response_go' : [0, 0, 0, 1, 1, 1, 0, 1, 0]}) 
df 

    ID response_go 
0 1   0 
1 1   0 
2 1   0 
3 2   1 
4 2   1 
5 2   1 
6 3   0 
7 3   1 
8 3   0 

使用groupby + mean -

v = df.groupby('ID').response_go.mean() 
v 

ID 
1 0.000000 
2 1.000000 
3 0.333333 
Name: response_go, dtype: float64 

利用np.selectresponse_goの平均値に基づいて、あなたの状態を計算する -

u = np.select([v == 1, v == 0, v < 1], ['100% Go', '100% NoGo', 'Mixed Response Pattern']) 

または、ネストされた、今

u = np.where(v == 1, '100% Go', np.where(v == 0, '100% NoGo', 'Mixed Response Pattern')) 

をバック結果を割り当てる - - 10は(若干速い)同じことを行うには

v[:] = u 
v 

ID 
1     100% NoGo 
2     100% Go 
3 Mixed Response Pattern 
Name: response_go, dtype: object 
+0

'pd.cut'もうまくいくはずです:-) – Wen

+0

@Wenあなたはどう思いますか?自由に答えを書く;) –

関連する問題