2017-04-30 7 views
2

Ich habe ein Pandas Datenframe, wobei eine Spalte nur Strings enthält.Erstellen einer Spalte in Pandas Datenframe basierend auf einer anderen Spalte

df= pd.DataFrame(
    { 
    "A": [2,4,7,17,39], 
    "B": ["apple","apple","broccoli","rose","apple"] 
    } 
) 

Ich möchte diese Spalte „B“ prüfen und sehen für alle Zeiten eine Zeichenfolge enthält einen bestimmten Teil eines Wortes. Dann erstelle ich eine neue Spalte "C", die eine Reihe von Strings enthält, die "Obst" sagen, wenn "app" in der Reihe ist, "flower" für wann immer "ros" erscheint und Gemüse für wenn "brocc" auftaucht.

wird das letzte Datenrahmen wie folgt aussehen:

df= pd.DataFrame(
    { 
    "A": [2,4,7,17,39], 
    "B": ["apple","apple","broccoli","rose","apple"], 
    "C": ["fruit","fruit", "vegetable", "flower", "fruit"] 
    } 
) 

Antwort

2

Sie ein Wörterbuch als Konverter könnte ein ist es get Methode als Eingabe für apply:

converter = {'apple': 'fruit', 
      'broccoli': 'veg', 
      'rose': 'flower'} 

df['C'] = df['B'].apply(converter.get) 
print(df) 
    A   B  C 
0 2  apple fruit 
1 4  apple fruit 
2 7 broccoli  veg 
3 17  rose flower 
4 39  apple fruit 

Im Falle der Teilübereinstimmung würden Sie brauchen um dies ein wenig zu ändern:

converter = {'app': 'fruit', 
      'brocc': 'vegetable', 
      'ros': 'flower'} 

df['C'] = df['B'].apply(lambda original: next(val for key, val in converter.items() if key in original)) 
print(df) 
    A   B   C 
0 2  apple  fruit 
1 4  apple  fruit 
2 7 broccoli vegetable 
3 17  rose  flower 
4 39  apple  fruit 

Die next(val for key, val in converter.items() if key in original) gibt Ihnen den Wert aus dem Wörterbuch für den ersten gefundenen Schlüssel, der sich in der "Zeile" befindet.

3

erstellen Wörterbuch

d = {'apple': 'fruit', 'broccoli': 'vegetable', 'rose': 'flower'} 

und verwenden Sie es in map oder replace (Karte ist schneller für diese):

df['B'].map(d) 
Out: 
0  fruit 
1  fruit 
2 vegetable 
3  flower 
4  fruit 
Name: B, dtype: object 

df['B'].replace(d) 
Out: 
0  fruit 
1  fruit 
2 vegetable 
3  flower 
4  fruit 
Name: B, dtype: object 
+0

ich leicht verändert sich die Frage, so dass der vollständige Name des Unternehmens isn‘ t erforderlich. Ändert dies die Antwort, die Sie zur Verfügung gestellt haben? – John

+0

@John Normalerweise sollten Sie die Frage nicht auf nicht-triviale Weise ändern (insbesondere wenn Sie die Antworten ungültig machen könnten). Stellen Sie stattdessen eine neue Frage. – MSeifert

+0

@John Nein, dies funktioniert nicht für die Teilübereinstimmung. Die Regel in der Frage ist nicht sehr klar. Sind die Teile der Wörter vorher festgelegt? Zum Beispiel werden Sie in der Lage sein, ein Wörterbuch wie dieses zu konstruieren? Oder möchten Sie dieses Wörterbuch verwenden, aber einen Wert zurückgeben, wenn es eine teilweise Übereinstimmung gibt? Für Letzteres müssen Sie klären, welche Art von Übereinstimmung akzeptabel ist. Was passiert wenn nur "o" ist? Wäre es ein Gemüse oder eine Blume? – ayhan

Verwandte Themen