python:奇怪的str.contains行为

Sat*_*tya 3 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   
Run Code Online (Sandbox Code Playgroud)

但是当我在查询的时候,我发现了一些差异,因为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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,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
Run Code Online (Sandbox Code Playgroud)

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

我很好奇,如果'|' 符号对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 
Run Code Online (Sandbox Code Playgroud)

因为它似乎用"或"操作来对待FANTASY和HORROR.***不确定

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

据我所知,在一个strind中,所有包含在''或'中仅作为char处理(除了\ t,\ r,\n).但我不知道逻辑运算符是否曾以相同的方式工作(我有很多次看到并在一个字符串内).

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

Bre*_*arn 5

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

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