2017-05-12 144 views
2

我正在爲此付出努力。我有一個DataFrame像:根據來自另一列的多個條件填充列

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方法:

frame['new'] = frame.A.replace(color_to_num) 
+0

已解決。非常感謝。 – Vini

2

使用dot,因爲它的樂趣。

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而不是@ for 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 
相關問題