Tìm kiếm trên Mt không chứa chứa trên một DataFrame trong gấu trúc


142

Tôi đã thực hiện một số tìm kiếm và không thể tìm ra cách lọc một khung dữ liệu theo df["col"].str.contains(word), tuy nhiên tôi tự hỏi liệu có cách nào để làm ngược lại: lọc một khung dữ liệu theo lời khen của tập hợp đó. ví dụ: ảnh hưởng của !(df["col"].str.contains(word)).

Điều này có thể được thực hiện thông qua một DataFramephương pháp?

Câu trả lời:


264

Bạn có thể sử dụng toán tử invert (~) (hoạt động như không phải cho dữ liệu boolean):

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

, new_dfbản sao được trả lại bởi RHS.

cũng chứa chấp nhận một biểu thức chính quy ...


Nếu cách trên ném ra ValueError, lý do có thể là do bạn có các kiểu dữ liệu hỗn hợp, vì vậy hãy sử dụng na=False:

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

Hoặc là,

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

1
Hoàn hảo! Tôi quen thuộc với regex và nghĩ rằng nó khác với Python - đã xem rất nhiều bài viết re.compliesvà tự nói với bản thân mình rằng tôi sẽ hiểu điều đó sau. Có vẻ như tôi quá phù hợp với tìm kiếm và nó giống như bạn nói :)
stites

6
Có thể một ví dụ đầy đủ sẽ hữu ích: df[~df.col.str.contains(word)]trả về một bản sao của khung dữ liệu gốc với các hàng bị loại trừ khớp với từ đó.
Dennis Golomazov

45

Tôi cũng gặp vấn đề với biểu tượng không (~), vì vậy đây là một cách khác từ một luồng StackOverflow khác :

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

Nó có thể được kết hợp như thế này? df[df["col1"].str.contains('this'|'that')==False and df["col2"].str.contains('foo'|'bar')==True]? Cảm ơn!
tommy.carstensen

Vâng, bạn có thể. Cú pháp được giải thích tại đây: stackoverflow.com/questions/22086116/ từ
tommy.carstensen

Đừng quên rằng nếu chúng ta muốn rwmove các hàng có chứa "|" chúng ta nên sử dụng "\" như df = df[~df["col"].str.contains('\|')]
Amir

9

Bạn có thể sử dụng Áp dụng và Lambda để chọn các hàng trong đó một cột chứa bất kỳ thứ gì trong danh sách. Đối với kịch bản của bạn:

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

6

Tôi đã phải loại bỏ các giá trị NULL trước khi sử dụng lệnh được đề xuất bởi Andy ở trên. Một ví dụ:

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

Bây giờ đang chạy lệnh:

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

Tôi nhận được lỗi sau đây:

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

Tôi đã loại bỏ các giá trị NULL bằng cách sử dụng dropna () hoặc fillna () trước và thử lại lệnh mà không gặp vấn đề gì.


1
Bạn cũng có thể sử dụng ~df["second"].astype(str).str.contains(word)để buộc chuyển đổi thành str. Xem stackoverflow.com/questions/43568760/
David C

1
@Shoresh chúng ta cũng có thể sử dụng na = Sai như một giải pháp cho vấn đề này
Vishav Gupta

5

Tôi hy vọng câu trả lời đã được đăng

Tôi đang thêm khung để tìm nhiều từ và phủ định những từ đó từ dataFrame .

Ở đây 'word1','word2','word3','word4'= danh sách các mẫu để tìm kiếm

df = Khung dữ liệu

column_a = Một tên cột từ DataFrame df

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

Bổ sung cho câu trả lời của nanselm2, bạn có thể sử dụng 0thay vì False:

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

có vẻ như điều này cũng xóa bất kỳ hàng nào vớiNaN
bshelt141
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.