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