2017-05-12 4 views
2

Ich habe damit zu kämpfen. Ich habe einen Datenrahmen wie:Füllen einer Spalte basierend auf mehreren Bedingungen aus einer anderen Spalten

import pandas as pd 

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

frame = pd.DataFrame(data) 

Und ich möchte, basierend auf mehreren Bedingungen aus der ‚A‘ Spalte eine neue Spalte erstellen. Zum Beispiel, wenn 'A' rot oder blau ist, möchte ich, dass diese neue Spalte gleich 10 ist; wenn 'A' grün ist, gleich 20 und so weiter.

Die Sache ist, ich denke, ich kann eine verschachtelte np.where verwenden, aber ich interessiere mich für die Lesbarkeit hier.

Antwort

5

Sie können einen Wörterbuch, um die Farbe zu numerischem Mapping definieren und dann die map Methode auf Spalte A verwenden:

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 

Oder replace Methode verwenden:

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

Gelöst. Danke vielmals. – Vini

2

dot Mit weil es Spaß macht.

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 

Oder, wenn Sie wirklich, wirklich 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 

auch dies ist eine Art ordentlich wollen. Nur Python 3, verwenden Sie dot anstelle von @ für 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 
Verwandte Themen