python:奇怪的str.contains行为

python:奇怪的str.contains行为,python,string,pandas,Python,String,Pandas,我有一个名为df的数据帧,名为df=pd.read\u csv('my.csv') 但是当我进行查询时,我发现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

我有一个名为df的数据帧,名为df=pd.read\u csv('my.csv')

但是当我进行查询时,我发现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
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
正如您所看到的,EVENT|u GENRE字段不包含“ROAMNCE”,但当我没有将“|”例如“| roman |”改为“roman”时,我会得到预期的输出

 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
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()方法有影响。我非常怀疑它的行为是否像“或”操作。当我试着

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 
似乎它用“或”操作来处理幻想和恐怖。***不确定

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

据我所知,在strind中,所有包含在“”或“”中的都只被视为char(除了\t\r\n)。但我不知道逻辑运算符是否以相同的方式工作过(正如我多次看到的那样&在字符串中)


任何人都可以澄清这一点。在Adv.

中表示感谢,因为
是一个特殊字符,您需要使用
\
符号对其进行转义:

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

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


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

关闭regex比转义字符串中的所有内容更简单。@BrenBarn是的,但在这种情况下,输入更少。:)答案似乎还可以。但是(为了未来的时间旅行者),你能指出你在使用什么图书馆吗?添加标签,因为它肯定是相关的(内置的
str
没有属性
包含
,我完全被搞糊涂了)。@mariusiuram你是在建议我从问题中删除字符串标签吗???我是在建议添加任何
read_csv
的东西,也许是熊猫?我不知道什么缩写为
pd
,你的
str
对我来说似乎很神秘。@MariusSiuram没有投票的意义……从描述中可以清楚地看出,它是“python”,我的第一行读数据帧,这意味着它是python的pandas模块……(相对较少的人知道dask)…但下次我会处理这些问题。@BrenBarn您建议如何/在何处将regex=False放入df.query()中。。当我尝试dd=df.query(df['EVENT_-GENRE'].str.contains('ROMANCE |'),regex=False)时,得到了一个错误,因为TypeError:eval()得到了一个意外的关键字参数'regex'…这很好…dd=df.query(df['EVENT_-GENRE'].str.contains('ROMANCE |,regex=False))