python:奇怪的str.contains行为

时间:2016-01-28 08:01:42

标签: python string pandas

我有一个名为df的数据框为df = pd.read_csv(' my.csv')

    CUSTOMER_MAILID                       EVENT_GENRE       EVENT_LANGUAGE  
0   000.tushar@gmail.com                    |ROMANCE|          Hindi   
1   000.tushar@gmail.com                      |DRAMA|          TAMIL   
2        satya@gmail.com                    |ROMANCE|          Hindi   
3   000.tushar@gmail.com                      |DRAMA|          Hindi   
4          sat@gmail.com    |ACTION|ADVENTURE|SCI-FI|        English   
5   000.tushar@gmail.com    |ACTION|ADVENTURE|COMEDY|        English   
6       fdvklf@gmail.com                     |ACTION|          Hindi   
7        asdar@gmail.com                      |DRAMA|          Hindi   
8       dfvkme@gmail.com     |FANTASY|HORROR|ROMANCE|        English   
9   000.tushar@gmail.com  |ACTION|ADVENTURE|THRILLER|        English   
10        king@gmail.com                      |DRAMA|          Hindi   
11  000.tushar@gmail.com           |ROMANCE|THRILLER|        KANNADA   
12  000.tushar@gmail.com                      |DRAMA|          Hindi   
13  000.tushar@gmail.com     |ACTION|ADVENTURE|DRAMA|        English   
14      iamher@gmail.com     |ACTION|ADVENTURE|DRAMA|         TELUGU   
15  000.tushar@gmail.com               |BIOPIC|DRAMA|          Hindi   
16    0007ayan@gmail.com            |HORROR|THRILLER|          Hindi   
17    0007ayan@gmail.com     |ACTION|COMEDY|THRILLER|           ODIA   
18  000.tushar@gmail.com    |ACTION|ADVENTURE|SCI-FI|        English   
19    0007ayan@gmail.com                    |ROMANCE|          Hindi   

但是当我查询时,我发现某些意义上的差异,str.contains没有给我预期的输出。

 d = df.query((df['EVENT_GENRE'].str.contains('|ROMANCE|')) & (df['EVENT_LANGUAGE'] == 'Hindi'))
 d
 Out[53]: 
     CUSTOMER_MAILID        EVENT_GENRE EVENT_LANGUAGE
 0   000.tushar@gmail.com          |ROMANCE|          Hindi
 2        satya@gmail.com          |ROMANCE|          Hindi
 3   000.tushar@gmail.com            |DRAMA|          Hindi
 6       fdvklf@gmail.com           |ACTION|          Hindi
 7        asdar@gmail.com            |DRAMA|          Hindi
 10        king@gmail.com            |DRAMA|          Hindi
 12  000.tushar@gmail.com            |DRAMA|          Hindi
 15  000.tushar@gmail.com     |BIOPIC|DRAMA|          Hindi
 16    0007ayan@gmail.com  |HORROR|THRILLER|          Hindi
 19    0007ayan@gmail.com          |ROMANCE|          Hindi

正如您所看到的,EVENT_GENRE字段不包含' ROAMNCE',但当我没有' |'恩。 ' | ROMANCE |'到了“ROMANCE'”,我得到了预期的输出。

d = df.query((df['EVENT_GENRE'].str.contains('ROMANCE')) & (df['EVENT_LANGUAGE'] == 'Hindi'))

d
Out[55]: 
     CUSTOMER_MAILID EVENT_GENRE EVENT_LANGUAGE
0   000.tushar@gmail.com   |ROMANCE|          Hindi
2        satya@gmail.com   |ROMANCE|          Hindi
19    0007ayan@gmail.com   |ROMANCE|          Hindi

然后我尝试了不同的场景' |' (发现奇怪的结果)和没有(' |')(找到预期的结果)。

我很好奇是否' |'符号对str.contains()方法有一些影响。我非常怀疑它的行为类似于"或"操作。当我尝试用

时的Bcoz
dd = df.query(df['EVENT_GENRE'].str.contains('FANTASY|HORROR'))

dd
Out[21]: 
       CUSTOMER_MAILID               EVENT_GENRE EVENT_LANGUAGE  
8     dfvkme@gmail.com  |FANTASY|HORROR|ROMANCE|        English   
16  0007ayan@gmail.com         |HORROR|THRILLER|          Hindi 

因为它似乎用“#34;或"”来对待FANTASY和HORROR。操作。***不确定

使用dd = df.query(df [' EVENT_GENRE']。str.contains(' | FANTASY | HORROR |'))选择所有数据。

据我所知,所有内容都包含在''或""仅作为char处理(除了\ t,\ r,\ n)。但我不知道逻辑运算符是否曾以相同的方式工作(很多时候我看过&在字符串中)。

任何人都可以澄清一下。感谢Adv。

2 个答案:

答案 0 :(得分:5)

默认情况下,contains会将您的字符串视为正则表达式以匹配字符串。因此,您的"|ROMANCE|"被视为正则表达式。由于第一个和最后一个替换为空(即,在第一个|之前或之后没有任何内容),它可以匹配空字符串,因此它始终匹配。

您可以将regex=False参数传递给contains,以强制它仅匹配您的文字字符串。

答案 1 :(得分:2)

因为|是一个特殊字符,您需要使用\符号转义它:

In [255]: df[df.EVENT_GENRE.str.contains('\|ROMANCE\|')]
Out[255]:
         CUSTOMER_MAILID               EVENT_GENRE EVENT_LANGUAGE
0   000.tushar@gmail.com                 |ROMANCE|          Hindi
2        satya@gmail.com                 |ROMANCE|          Hindi
8       dfvkme@gmail.com  |FANTASY|HORROR|ROMANCE|        English
11  000.tushar@gmail.com        |ROMANCE|THRILLER|        KANNADA
19    0007ayan@gmail.com                 |ROMANCE|          Hindi