2017-06-16 6 views
2

Ich habe einen Pandas-Datenrahmen mit zwei Spalten.Verwenden von df.column.str.contains und Aktualisieren einer Pandas-Datenframe-Spalte

df= pd.DataFrame({"C": ['this is orange','this is apple','this is pear','this is plum','this is orange'], "D": [0,0,0,0,0]}) 

Ich möchte diese C-Spalte lesen und in der D-Spalte den Namen der Frucht zurückgeben. Mein Denkprozess verwendete also df.C.str.contains, um zu bestimmen, ob eine bestimmte Zeichenkette in jeder Zeile von C erscheint und D dann entsprechend aktualisiert wird. Die Elemente in C können wirklich lange Zeichenketten sein: ex. "Das ist ein Apfel, der rot ist", aber es interessiert mich nur, ob das Wort Apfel in der Zelle erscheint. Ich sollte beachten, dass ich nicht an die Verwendung von str.contains gebunden bin, aber dies schien der offensichtlichste Weg zu mir. Nur nicht sicher, wie ich es anwenden würde.

wird das letzte Datenrahmen wie folgt aussehen:

df= pd.DataFrame({"C": ['this is orange','this is apple','this is pear','this is plum','this is orange'], "D": ['orange','apple','pear','plum','grapefruit']}) 

Antwort

1

Betrachten Sie diese Datenrahmen

df= pd.DataFrame({"C": ['this is orange','this is apple which is red','this is pear','this is plum','this is orange'], "D": [0,0,0,0,0]}) 

    C       D 
0 this is orange    0 
1 this is apple which is red 0 
2 this is pear    0 
3 this is plum    0 
4 this is orange    0 

Sie den folgenden Code verwenden, um die Frucht Name der Frucht NAHME den Namen zu extrahieren folgt 'das ist'

df['D'] = df.C.str.extract('this is ([A-Za-z]+)\s?.*?') 

Sie erhalten

C       D 
0 this is orange    orange 
1 this is apple which is red apple 
2 this is pear    pear 
3 this is plum    plum 
4 this is orange    orange 

Für das Beispiel-Dataset, das Sie gepostet haben, eine einfache Aufteilung auf Leerzeichen und Extrahieren der La st Element arbeitet

df['D'] = df.C.str.split(' ').str[-1] 
+0

Wenn sich die Frage ändert vollständig verstehen und werde ich wieder fragen, aber was ist, wenn die Frucht wurde von Klammern und ohne Leerzeichen eingewickelt? Es könnte also etwas wie dieses sein (orange). Und ich möchte nur das Wort Orange zurückgeben. – John

+0

Sie können df.C.str.extract ('das ist \ (? ([A-Za-z] +) \ s?. *?') Verwenden, um die Möglichkeit der Klammer um eine Frucht zu behandeln. Es funktioniert für beide die Fälle – Vaishali

+0

Und danke für die Annahme :) – Vaishali

1

Da Sie nicht angegeben, wie die Frucht gewonnen wird, gehe ich davon aus, dass es immer von „dies“ vorangestellt ist; und deshalb sollte die folgenden ein langer Weg:

import pandas as pd 

d = {'C': ['this is orange', 
    'this is apple', 
    'this is pear', 
    'this is plum', 
    'this is orange'], 
'D': [0, 0, 0, 0, 0]} 

dff = pd.DataFrame(d) 

dff['D'] = dff.C.str.replace(r'(this is) ([A-Za-z]+)','\\2') 
# or just 
dff.C.str.replace('this is ','') 


#     C  D 
# 0 this is orange orange 
# 1 this is apple apple 
# 2 this is pear pear 
# 3 this is plum plum 
# 4 this is orange orange 

Dies verwendet .str.replace zu ersetzen „dies“ mit einem leeren String.

Ich hoffe, das hilft.

1

Wenn die Sätze beginnen immer mit this is und gefolgt von fruit name dh wenn drittem Wort fruit name ist immer dann, können Sie auch apply zusammen mit split() Funktion verwenden, so dass für jede Reihe von Datenrahmen string geteilt und dritte des Ergebnisses wird genommen Wert für D Spalte zu ersetzen:

df['D'] = df['C'].apply(lambda val: val.split()[2]) 

Oder wie in anderen Antwort einfach split Funktion angegeben,

df['D'] = df['C'].str.split().str[2]

Ausgang:

C D 0 this is orange orange 1 this is apple apple 2 this is pear pear 3 this is plum plum 4 this is orange orange

Verwandte Themen