2016-05-03 5 views
7

df (Pandas Dataframe) имеет три строки.pandas dataframe str.contains() AND операция

some_col_name 
"apple is delicious" 
"banana is delicious" 
"apple and banana both are delicious" 

df.col_name.str.contains ("яблоко | банан")

будет ловить все строки:

"яблоко вкусно", "банан вкусный", «яблоко и банан оба вкусные».

Как применить оператор AND к методу str.contains, чтобы он захватывал только строки, содержащие BOTH apple & banana?

"apple and banana both are delicious" 

Я хотел бы, чтобы захватить строки, которые содержат 10-20 различных слов (виноград, арбуз, ягоды, апельсин, ... и т.д.)

ответ

6

Вы можете сделать это следующим образом:

df[(df['col_name'].str.contains('apple')) & (df['col_name'].str.contains('banana'))] 
0

Вы также можете сделать это в регулярном выражении стиля выражения:

df[df['col_name'].str.contains(r'^(?=.*apple)(?=.*banana)')] 

Вы можете, построить свой список слов в строку регулярного выражения как так:

base = r'^{}' 
expr = '(?=.*{})' 
words = ['apple', 'banana', 'cat'] # example 
base.format(''.join(expr.format(w) for w in words)) 

окажем:

'^(?=.*apple)(?=.*banana)(?=.*cat)' 

Затем вы можете сделать свой материал динамически.

0

Попробуйте это регулярное выражение

apple.*banana|banana.*apple 

Кодекс:

import pandas as pd 

df = pd.DataFrame([[1,"apple is delicious"],[2,"banana is delicious"],[3,"apple and banana both are delicious"]],columns=('ID','String_Col')) 

print df[df['String_Col'].str.contains(r'apple.*banana|banana.*apple')] 

Выход

ID       String_Col 
2 3 apple and banana both are delicious 
8
df = pd.DataFrame({'col': ["apple is delicious", 
          "banana is delicious", 
          "apple and banana both are delicious"]}) 

targets = ['apple', 'banana'] 

# Any word from `targets` are present in sentence. 
>>> df.col.apply(lambda sentence: any(word in sentence for word in targets)) 
0 True 
1 True 
2 True 
Name: col, dtype: bool 

# All words from `targets` are present in sentence. 
>>> df.col.apply(lambda sentence: all(word in sentence for word in targets)) 
0 False 
1 False 
2  True 
Name: col, dtype: bool 
1

, если вы хотите, чтобы поймать в минимуме по крайней мере два слова в предложении, может быть, это будет работать (с верхушку от @Alexander):

target=['apple','banana','grapes','orange'] 
connector_list=['and'] 
df[df.col.apply(lambda sentence: (any(word in sentence for word in target)) & (all(connector in sentence for connector in connector_list)))] 

выход:

        col 
2 apple and banana both are delicious 

, если у вас есть больше, чем два слова, чтобы поймать, которые отделены друг от друга запятой «» чем добавить его в connector_list и изменить второе условие от всех к любому выходу

df[df.col.apply(lambda sentence: (any(word in sentence for word in target)) & (any(connector in sentence for connector in connector_list)))] 

:

         col 
2  apple and banana both are delicious 
3 orange,banana and apple all are delicious 
Смежные вопросы