2017-04-19 12 views
2

.where pandasデータフレームメソッドを使用しようとしていますが、2つ以上の可能性しかありません(if else if if、elif、2つ以上の条件入力を持つPython Pandas .where

次のデータフレームを検討してください:

a1 = np.random.rand(7,2) 
a2 = np.random.randint(0,3,(7,1)) 
grid = np.append(a1, a2, axis=1) 
df = pd.DataFrame(grid) 

を私は

def test(x): 
    if x[2] == 0: 
     return 5 
    if x[2]==1: 
     return 10 
    if x[2] ==2: 
     return 50 

df.where(test) 

を試してみました。しかし、私はエラーメッセージ "セリエの真理値があいまいである" 受け取ります。私はこれが正しい方向だと思うが、私はそれを達成する方法を混乱させる。ドキュメントでは、条件が呼び出し可能である場合、入力は完全なdfとみなされます。しかし、それでもそれは列全体としてx[2]を考慮しているようです。そのタスクのベクトル化された操作を達成する方法はありませんか? iterrowsか適用かにかかわらず、行ごとに反復することは可能ですか?

これはフォーラムではっきりしたおもちゃの例ですが、実際の生活の問題では単純な.mapを実行しようとしていません。私の難しさがある場所であるので、あなたが答えて渡す必要がある別の機能として "テスト"機能を保ってください。 map

答えて

2
np.random.seed(100) 
a1 = np.random.rand(7,2) 
a2 = np.random.randint(0,3,(7,1)) 
grid = np.append(a1, a2, axis=1) 
df = pd.DataFrame(grid) 
print (df) 
      0   1 2 
0 0.543405 0.278369 2.0 
1 0.424518 0.844776 2.0 
2 0.004719 0.121569 0.0 
3 0.670749 0.825853 0.0 
4 0.136707 0.575093 1.0 
5 0.891322 0.209202 1.0 
6 0.185328 0.108377 1.0 

対処:

d = {0:5,1:10,2:50} 
df['d'] = df[2].map(d) 
print (df) 
      0   1 2 d 
0 0.543405 0.278369 2.0 50 
1 0.424518 0.844776 2.0 50 
2 0.004719 0.121569 0.0 5 
3 0.670749 0.825853 0.0 5 
4 0.136707 0.575093 1.0 10 
5 0.891322 0.209202 1.0 10 
6 0.185328 0.108377 1.0 10 

numpy.whereと別の解決策:

df['d'] = np.where(df[2] == 0, 5, 
      np.where(df[2]== 1, 10, 50)) 

print (df) 
      0   1 2 d 
0 0.543405 0.278369 2.0 50 
1 0.424518 0.844776 2.0 50 
2 0.004719 0.121569 0.0 5 
3 0.670749 0.825853 0.0 5 
4 0.136707 0.575093 1.0 10 
5 0.891322 0.209202 1.0 10 
6 0.185328 0.108377 1.0 10 

編集:

別個の機能については、処理のパラメータaxis=1で可能な使用applyあります

def test(x): 
    #print (x) 
    if x[2] == 0: 
     return 5 
    if x[2]==1: 
     return 10 
    if x[2] ==2: 
     return 50 

df['d'] = df.apply(test, axis=1) 
print (df) 
      0   1 2 d 
0 0.543405 0.278369 2.0 50 
1 0.424518 0.844776 2.0 50 
2 0.004719 0.121569 0.0 5 
3 0.670749 0.825853 0.0 5 
4 0.136707 0.575093 1.0 10 
5 0.891322 0.209202 1.0 10 
6 0.185328 0.108377 1.0 10 

しかし、必要機能場合:rowsによって

def test(x): 
    return np.where(x == 0, 5, np.where(x== 1, 10, 50)) 

print (test(df[2])) 
[50 50 5 5 10 10 10] 
+0

HI、ありがとうございました。関数 "test"をマップまたはどこで渡される別の関数として保持するかの答えを表示できますか?これは私の実際の人生の例で私を助けるものです。 –

+0

Ok thx:ここでは、適用またはiterrowsのいずれかを使用する必要があることを理解しています - 私は考えられるようにベクトル化された操作を使用して結果を達成する方法はありませんか? whereメソッドのドキュメントでは、私がここでやろうとしている呼び出し可能コードを使用する可能性が言及されています:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.where。 html –

+0

はい私はそうするべきだと思います。私はそれをテストする時間を取るだろうが、私はどこよりも速く適用されると思われる?その場合は、私が探しているのは –

関連する問題