2017-05-12 2 views
2

私はこれに苦労しています。私は以下のようなデータフレームを持っています:別の列の複数の条件に基づいて列を塗りつぶし

import pandas as pd 

data = {'A': ['red', 'green', 'blue', 'green', 'yellow', 'blue'], 
     'B': [1, 2, 1, 1, 2, 1]} 

frame = pd.DataFrame(data) 

そして、私は 'A'列から複数の条件に基づいて新しい列を作成したいと思います。たとえば、 'A'が赤または青の場合、この新しい列を10にします。 'A'が緑色ならば、20に等しくなります。

問題は、ネストされたnp.whereを使用することができますが、私はここでは読みやすさを気にしています。

答えて

5

あなたは数字のマッピングに色を定義した辞書を作成し、その後、カラムAにmapメソッドを使用することができます

color_to_num = {'red': 10, 'blue': 10, 'green': 20, 'yellow': 30}  
frame['new'] = frame.A.map(color_to_num) 

frame 
#  A B new 
#0 red  1 10 
#1 green 2 20 
#2 blue 1 10 
#3 green 1 20 
#4 yellow 2 30 
#5 blue 1 10 

それともreplaceメソッドを使用します。それは楽しいので

dotを使用して
frame['new'] = frame.A.replace(color_to_num) 
+0

解決済み。どうもありがとう。 – Vini

2

を。

s = pd.Series({'red': 10, 'blue': 10, 'green': 20, 'yellow': 30}) 
frame.assign(new=pd.get_dummies(frame.A).dot(s)) 

     A B new 
0  red 1 10 
1 green 2 20 
2 blue 1 10 
3 green 1 20 
4 yellow 2 30 
5 blue 1 10 

または、あなたは本当に、本当にnp.where

a = frame.A.values 
red = a == 'red' 
blue = a == 'blue' 
green = a == 'green' 
yellow = a == 'yellow' 
new = np.where(red | blue, 10, np.where(green, 20, np.where(yellow, 30, -1))) 
frame.assign(new=new) 

     A B new 
0  red 1 10 
1 green 2 20 
2 blue 1 10 
3 green 1 20 
4 yellow 2 30 
5 blue 1 10 

は、これも一種のきちんとしている場合です。 Python 3のみ、@の代わりにdotをPython 2に使用します。

a = frame.A.values 
red = a == 'red' 
blue = a == 'blue' 
green = a == 'green' 
yellow = a == 'yellow' 

new = np.column_stack([red | blue, green, yellow]) @ [10, 20, 30] 
frame.assign(new=new) 

     A B new 
0  red 1 10 
1 green 2 20 
2 blue 1 10 
3 green 1 20 
4 yellow 2 30 
5 blue 1 10 
関連する問題