Pandalarda bir DataFrame'de "içermez" ifadesini arayın


142

Bazı araştırmalar yaptım ve bir veri çerçevesini nasıl filtreleyeceğimi bulamıyorum df["col"].str.contains(word), ancak bunun tersini yapmanın bir yolu olup olmadığını merak ediyorum: bir veri çerçevesini bu kümenin iltifatına göre filtreleyin. örneğin: etkisine !(df["col"].str.contains(word)).

Bu bir DataFrameyöntemle yapılabilir mi?

Yanıtlar:


264

Ters çevirme (~) operatörünü (boole verileri için değil gibi davranan) kullanabilirsiniz:

new_df = df[~df["col"].str.contains(word)]

, nerede new_df RHS tarafından iade edilen kopya .

içerir ayrıca bir normal ifadeyi de kabul eder ...


Yukarıdakiler bir ValueError atarsa, bunun nedeni büyük olasılıkla karışık veri türlerine sahip olmanızdır, bu nedenle şunu kullanın na=False:

new_df = df[~df["col"].str.contains(word, na=False)]

Veya,

new_df = df[df["col"].str.contains(word) == False]

1
Mükemmel! SQL'e aşinayım ve Python'da farklı olduğunu düşündüm - birçok makale gördüm re.compliesve kendime buna daha sonra ulaşacağımı söyledim. Görünüşe göre aramaya fazla uyuyorum ve tam da dediğiniz gibi
:)

6
Belki tam bir örnek yardımcı olabilir: df[~df.col.str.contains(word)]orijinal veri çerçevesinin bir kopyasını, kelime ile eşleşen hariç tutulan satırlarla döndürür.
Dennis Golomazov

45

Not (~) sembolüyle de sorun yaşıyordum, işte başka bir StackOverflow iş parçacığından başka bir yol :

df[df["col"].str.contains('this|that')==False]

Bu şekilde birleştirilebilir mi? df[df["col1"].str.contains('this'|'that')==False and df["col2"].str.contains('foo'|'bar')==True]? Teşekkürler!
tommy.carstensen

Evet yapabilirsin. Sözdizimi burada açıklanmıştır: stackoverflow.com/questions/22086116/…
tommy.carstensen

"|" İçeren satırları yeniden taşımak istiyorsak unutmamak gerekir. "\" gibi kullanmalıyız df = df[~df["col"].str.contains('\|')]
Amir

9

Bir sütunun listedeki herhangi bir şeyi içerdiği satırları seçmek için Uygula ve Lambda'yı kullanabilirsiniz. Senaryonuz için:

df[df["col"].apply(lambda x:x not in [word1,word2,word3])]

6

Yukarıda Andy tarafından önerilen komutu kullanmadan önce NULL değerlerinden kurtulmam gerekiyordu. Bir örnek:

df = pd.DataFrame(index = [0, 1, 2], columns=['first', 'second', 'third'])
df.ix[:, 'first'] = 'myword'
df.ix[0, 'second'] = 'myword'
df.ix[2, 'second'] = 'myword'
df.ix[1, 'third'] = 'myword'
df

    first   second  third
0   myword  myword   NaN
1   myword  NaN      myword 
2   myword  myword   NaN

Şimdi şu komutu çalıştırıyorum:

~df["second"].str.contains(word)

Şu hatayı alıyorum:

TypeError: bad operand type for unary ~: 'float'

Önce dropna () veya fillna () kullanarak NULL değerlerinden kurtuldum ve komutu sorunsuz bir şekilde tekrar denedim.


1
Ayrıca ~df["second"].astype(str).str.contains(word), dönüştürmeye zorlamak için de kullanabilirsiniz str. Stackoverflow.com/questions/43568760/… sayfasına
David C

1
@Shoresh, bu sorunun çözümü olarak na = False da kullanabiliriz
Vishav Gupta

5

Umarım cevaplar çoktan gönderilmiştir

Birden çok kelime bulmak ve bunları dataFrame'den olumsuzlamak için çerçeve ekliyorum .

Burada 'word1','word2','word3','word4'= aranacak modellerin listesi

df = DataFrame

column_a = DataFrame df'den bir sütun adı

Search_for_These_values = ['word1','word2','word3','word4'] 

pattern = '|'.join(Search_for_These_values)

result = df.loc[~(df['column_a'].str.contains(pattern, case=False)]

3

Nanselm2'nin cevabına ek olarak, 0bunun yerine şunu kullanabilirsiniz False:

df["col"].str.contains(word)==0

Görünüşe göre bu aynı zamandaNaN
bshelt141
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.