我有一个名为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()方法有一些影响。我非常怀疑它的行为类似于"或"操作。当我尝试用
时的Bcozdd = 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。
答案 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