2016-05-03 40 views
7

df (Pandas Dataframe) öğesinin üç satırı vardır.pandalar dataframe str.contains() VE işlemi

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

df.col_name.str.contains ("elma | muz")

tüm satırları yakalayacak:

"muz lezzetlidir", "elma lezzetli", "elma ve muz her ikisi de lezzetli".

VE operatörü str.contains yöntemine nasıl uygularım, böylece yalnızca BOTH elma & banana içeren dizeleri yakalar?

"apple and banana both are delicious" 

Ben 10-20 farklı kelimeler (üzüm, karpuz, dut, portakal, ..., vb) içeren dizeleri kapmak istiyorum

cevap

6
bunu yapabilirsiniz

aşağıdaki gibi olduğu:

df[(df['col_name'].str.contains('apple')) & (df['col_name'].str.contains('banana'))] 
0
Ayrıca regex ifade tarzında yapabiliriz

: Daha sonra, bir normal ifade dizeye kelimelerin listenizi oluşturabilirsiniz

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

şöyle:

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

verecek:

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

Sonra dinamik eşyalarını yapabilirsiniz.

0

bu regex deneyin

apple.*banana|banana.*apple 

Kod geçerli:

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')] 

Çıktı

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

Eğer minimum yakalamak istiyorsanız en az cümlede iki kelime, belki bu (@Alexander gelen ucu alarak) çalışır:

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)))] 

çıkışı:

        col 
2 apple and banana both are delicious 

edilenden daha fazla varsa iki kelime herhangi

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

çıkışa tüm connector_list ekleyin ve ikinci durum değiştirme daha '' virgülle ayrılmış olan yakalamak için:

         col 
2  apple and banana both are delicious 
3 orange,banana and apple all are delicious