从pandas中的数据框列中搜索字符串模式

时间:2016-04-25 06:33:59

标签: python regex pandas

继续堆叠searching matching string pattern from dataframe column in python pandas

中的最后一个问题

假设我有一个数据框

 name         genre
 satya      |ACTION|DRAMA|IC|
 satya      |COMEDY|DRAMA|SOCIAL|MUSIC|
 abc        |DRAMA|ACTION|BIOPIC|
 xyz        |ACTION||ROMANCE|DARMA|
 def        |ACTION|SPORT|COMEDY|IC|
 ghj        |IC|ACTIONDRAMA|NOACTION|

根据我上一个问题的答案,如果在类型栏中独立存在,我可以搜索任何一种类型(ex IC),而不是任何其他类型字符串值(MUSIC或BIOPIC)的一部分。

现在我想知道ACTION和DRAMA是否都出现在一个类型列中,但不一定按特定顺序排列,也不是字符串的一部分,而是单独出现。

所以我需要输出行[1,3,4]

中的行
 name         genre
 satya      |ACTION|DRAMA|IC|   # both adjacently present
 #row 2 will not come           # as only DRAMA present not ACTION
 abc        |DRAMA|ACTION|BIOPIC|   ### both adjacently present in diff. order
 xyz        |ACTION||ROMANCE|DARMA|   ### both present not adjacent
 ##row  5 should not present as DRAMA is not here
 ## row 6 should not come as both are not present individually(but present as one string part)

我试过像

这样的东西
 x = df[df['gen'].str.contains('\|ACTION\|DRAMA\|')]
 ### got only Row  1 (ACTION and DRAMA in adjacent and in order ACTION->DRAMA)

请有人建议可以遵循/添加的内容,以便我能在这里得到我需要的东西。

2 个答案:

答案 0 :(得分:2)

我认为您可以将str.contains与AND - &使用两个条件:

print df
    name                        genre
0  satya            |ACTION|DRAMA|IC|
1  satya  |COMEDY|DRAMA|SOCIAL|MUSIC|
2    abc        |DRAMA|ACTION|BIOPIC|
3    xyz      |ACTION||ROMANCE|DRAMA|
4    def     |ACTION|SPORT|COMEDY|IC|
5    ghj    |IC|ACTIONDRAMA|NOACTION|

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

print df[ df['genre'].str.contains('\|ACTION\|') & df['genre'].str.contains('\|DRAMA\|') ]
    name                    genre
0  satya        |ACTION|DRAMA|IC|
2    abc    |DRAMA|ACTION|BIOPIC|
3    xyz  |ACTION||ROMANCE|DRAMA|

答案 1 :(得分:0)

我不太确定这个答案,因为我这里没有编译器,但尝试使用这个。

(\|ACTION|\|DRAMA).*?(\|ACTION|\|DRAMA)

希望它有所帮助。