2016-03-22 16 views
1

Hücre dize önceden tanımlanmış sette değerlerin herkes içeriyorsa satırlara filtre etmek istiyorum.Sütun değeri (dizgi) python kümesindeki herhangi bir değerden herhangi birini içeriyorsa, veri çerçeve satırları nasıl filtrelenir?

Örneğin, aşağıdaki dataframe için:

ids ids2 vals 
0 a h a i  1 
3 n i n h  4 

Code:

ids ids2 vals 
0 a h a i  1 
1 b z n a  2 
2 f z c a  3 
3 n i n h  4 

I ekstre satır ('i' kimlikleri sütununda 'h' ya sahip satırlar) aşağıdaki isteyen oluşturmak dataframe:

d = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a h', 'b z', 'f z', 'n i'],'ids2': ['a i', 'n a', 'c a', 'n h']}) 

şimdiye kadar ne yaptım:

İşte
d[d['ids'].str.contains('h')|d['ids'].str.contains('i')] 

önceden tanımlanmış set küçük ve içerdiğiharfe duyarlıdır. Bunu, büyük/küçük harf duyarsızlığıyla veya bazı listeyi kullanarak yapabileceğim bir yöntem var mı.

d[len(re.findall('h|i',d['ids'].str,re.IGNORECASE)) > 0] 

ama bana TypeError: expected string or bytes-like object veriyor: Bunu yaptığım çalıştı.

veya bu:

data[any(d['name'].str.contains(x) for x in ['h','i'])] 

hata veriyor: KeyError: 'name' birisi bana bu konuda yardımcı olabilir misiniz?

d[d['ids'].str.contains('h', case=False)|d['ids'].str.contains('i',case=False)]

Bu kesinlikle biraz dolambaçlı ama çalışacaktır:

cevap

2

Kullanım case = False küçük harf duyarsız hale getirmek için

letters = ['h', 'i'] 
d[d['ids'].str.split().apply(lambda x: len(set(x).intersection(set(letters))))>0] 
+0

Tamam: terimleri katılır. beyan Neden O zaman bile – harshit

+0

şu anki çözüm mümkün olan tüm harfleri belirtmek sürece çalışacaktır @harshit or' tabloların 'çok yazmak zorunda kalacak' – harshit

+0

net açıklama yukarıda hale getirilecek soruyu Düzenlendi daha büyük bir listede –

1

Bir düzenli ifade geçirerek kolayca yapabilirsiniz olduğunu

In [132]: 
d[~d['ids'].str.contains('h|i', case=False)] 

Out[132]: 
    ids ids2 vals 
1 b z n a  2 
2 f z c a  3 
İlgili konular