2016-04-20 9 views
1

ich habe einen Datenrahmen wie untenpassendem String Muster von Datenrahmen Spalte in Python Pandas Suche

name   genre 
satya  |ACTION|DRAMA|IC| 
satya  |COMEDY|BIOPIC|SOCIAL| 
abc  |CLASSICAL| 
xyz  |ROMANCE|ACTION|DARMA| 
def  |DISCOVERY|SPORT|COMEDY|IC| 
ghj  |IC| 

Jetzt möchte ich die Datenrahmen abzufragen, so dass ich 1,5 und 6.Ich Reihe bekommen: ei möchte finden | IC | mit allein oder mit irgendeiner Kombination anderer Genres.

Bis jetzt bin ich in der Lage, entweder eine exakte Suche mit

df[df['genre'] == '|ACTION|DRAMA|IC|'] ######exact value yields row 1 

oder eine Zeichenfolge enthält die erweiterte Suche nach

df[df['genre'].str.contains('IC')] ####yields row 1,2,3,5,6 
# as BIOPIC has IC in that same for CLASSICAL also 

Aber ich will nicht, diese beiden zu tun.

#df[df['genre'].str.contains('|IC|')] #### row 6 
# This also not satisfying my need as i am missing rows 1 and 5 

So ist meine Anforderung-Genres zu finden, die | IC | in ihnen. (Meine String-Suche schlägt fehl, weil Python '|' als oder Operator behandelt)

Jemand schlägt einige reg oder irgendeine Methode vor, um das zu tun. Danke in ADv.

Antwort

3

Ich glaube, Sie \ hinzufügen können für die Flucht regex, weil | ohne \ als OR interpretiert wird:

'|'

A | B, wobei A und B beliebige REs sein können, erzeugt einen regulären Ausdruck, der entweder zu A oder B passt. Eine beliebige Anzahl von REs kann durch das '|' getrennt werden. auf diese Weise. Dies kann auch innerhalb von Gruppen (siehe unten) verwendet werden. Wenn die Zielzeichenfolge gescannt wird, werden die REs durch '|' werden von links nach rechts ausprobiert. Wenn ein Muster vollständig übereinstimmt, wird dieser Zweig akzeptiert. Dies bedeutet, dass B, sobald A übereinstimmt, nicht weiter getestet wird, auch wenn es zu einer längeren Gesamtübereinstimmung führen würde. Mit anderen Worten, das '|' Betreiber ist nie gierig. Um ein Literal '|' zu vergleichen, verwenden Sie \ | oder schließen Sie es innerhalb einer Zeichenklasse ein, wie in [|].

print df['genre'].str.contains(u'\|IC\|') 
0  True 
1 False 
2 False 
3 False 
4  True 
5  True 
Name: genre, dtype: bool 

print df[df['genre'].str.contains(u'\|IC\|')] 
    name      genre 
0 satya   |ACTION|DRAMA|IC| 
4 def |DISCOVERY|SPORT|COMEDY|IC| 
5 ghj       |IC| 
Verwandte Themen