2017-03-28 4 views
3

dfに新しい列を作成したい場合、この列の値は他のいくつかの列の値に対してマップされます。複数の列に対して列と行の値のマップを作成します。

df['PLATFORM'] = df['ID_1'].map(lambda x: 'ID_1_MATCH' if x == 9 else 0) 
df['PLATFORM'] = df['ID_2'].map(lambda x: 'ID_2_MATCH' if x == 10 else 0) 
df['PLATFORM'] = df['ID_3'].map(lambda x: 'ID_3_MATCH' if x == 11 else 0) 

このアプローチを使用して、新たな列の値が(xがラムダ式の条件に一致する)第二及び第三の地図に上書きされる。

現在私は、これは持っています。私は、前のマップの後に0の値が残っている列を更新したいだけです。

他のいくつかの列の行の値に応じて、値を新しい列にマップする方法はありますか?

答えて

3

私はあなたがnumpy.whereが必要だと思う:

df['PLATFORM'] = np.where(df['ID_1'] == 9, 'ID_1_MATCH', 
       np.where(df['ID_2'] == 10, 'ID_2_MATCH', 
       np.where(df['ID_3'] == 11, 'ID_3_MATCH', 0))) 

はサンプル:

df = pd.DataFrame({'ID_1':[9,2,3,4], 
        'ID_2':[4,10,6,1], 
        'ID_3':[7,8,11,0]}) 

print (df) 
    ID_1 ID_2 ID_3 
0  9  4  7 
1  2 10  8 
2  3  6 11 
3  4  1  0 

df['PLATFORM'] = np.where(df['ID_1'] == 9, 'ID_1_MATCH', 
       np.where(df['ID_2'] == 10, 'ID_2_MATCH', 
       np.where(df['ID_3'] == 11, 'ID_3_MATCH', 0))) 
print (df) 
    ID_1 ID_2 ID_3 PLATFORM 
0  9  4  7 ID_1_MATCH 
1  2 10  8 ID_2_MATCH 
2  3  6 11 ID_3_MATCH 
3  4  1  0   0 
+0

これは素晴らしい機能です - ありがとう! 'np.where'を何回入れ子にすることが推奨されていますか?この例では、最大10回のネストが必要です。 –

+0

制限はないと思います。それは大きなdfで少し遅くすることができます。 – jezrael

+0

完璧、ありがとう! –

1

はあなたの条件が真である行のみを設定するには、ビットマスクを使用してください。

これは、マップやラムダよりも慣れていて(そして速い)です。

>>> df = pandas.DataFrame(columns=['x', 'y'], data=[[0,1], [1,2]]) 
>>> df 
    x y 
0 0 1 
1 1 2 
>>> df.ix[df['x'] % 2 == 0, 'match'] = 'x is even' 
>>> df.ix[df['y'] % 2 == 0, 'match'] = 'y is even' 
>>> df 
    x y  match 
0 0 1 x is even 
1 1 2 y is even 
>>> 
+1

これは、以前に割り当てられた列の値を上書きする点を除いて、良いアプローチのようです。私は条件が重なっていないことを知っているなら、これを前進させることを間違いなく試みようとします。ありがとう! –