2014-10-29 28 views
8

Suy nghĩ điều này sẽ thẳng về phía trước nhưng có một số vấn đề theo dõi một cách thanh lịch để tìm kiếm tất cả các cột trong một khung dữ liệu cùng một lúc. Về cơ bản, làm cách nào để áp dụng df['col1'].str.contains('^') cho toàn bộ khung dữ liệu cùng một lúc và lọc xuống bất kỳ hàng nào có bản ghi chứa kết quả phù hợp?Tìm kiếm chuỗi trong tất cả các cột dữ liệu Pandas DataFrame và lọc

+0

Bạn muốn tìm kiếm toàn bộ dataframe chứ không phải chỉ là một cột cụ thể? – EdChum

+0

Phương thức 'str.contains' chỉ có giá trị cho Series vì ​​vậy bạn phải làm một cái gì đó như' cho col trong df: df [col] .str.contains ('^') ' – EdChum

Trả lời

16

Phương thức Series.str.contains hy vọng mẫu regex (theo mặc định), không phải là chuỗi ký tự bằng chữ. Do đó str.contains("^") khớp với đầu chuỗi bất kỳ. Vì mọi chuỗi đều có điểm bắt đầu, mọi thứ đều phù hợp. Thay vào đó, hãy sử dụng str.contains("\^") để khớp với ký tự ^ theo nghĩa đen.

Để kiểm tra tất cả các cột, bạn có thể sử dụng for col in df để lặp qua các tên cột, và sau đó gọi str.contains trên mỗi cột:

mask = np.column_stack([df[col].str.contains(r"\^", na=False) for col in df]) 
df.loc[mask.any(axis=1)] 

Ngoài ra, bạn có thể vượt qua regex=False-str.contains để làm cho thử nghiệm sử dụng Python in nhà điều hành; nhưng (nói chung) sử dụng regex nhanh hơn.

+1

Hey @unutbu, câu hỏi dành cho bạn . Tại sao bạn sử dụng 'np.column_stack 'khi bạn có thể sử dụng' pd.DataFrame (...). Transpose() '? – propjk007

+1

Khi 'mặt nạ' là một mảng Boolean NumPy,' df.loc [mask] ' các hàng đã chọn trong đó' mặt nạ' là Đúng. Nếu 'mask' là một DataFrame, tuy nhiên, sau đó ' df.loc [mask] 'chọn các hàng từ' df' có giá trị * index * khớp với giá trị chỉ mục trong 'mặt nạ' tương ứng với giá trị True. Sự liên kết này của chỉ số là tuyệt vời khi bạn cần, nhưng làm chậm hiệu suất khi bạn không. Vì vậy, trong ngắn hạn, nếu bạn không cần chỉ mục, hãy sử dụng một mảng NumPy thay vì một DataFrame. Ngoài ra, việc tạo DataFrame chậm hơn đáng kể so với việc tạo mảng NumPy để có không có lợi thế khi sử dụng 'pd.DataFrame ([...]). T' tại đây. – unutbu

+1

Tôi không nghĩ đến ảnh hưởng hiệu suất của phương pháp DataFrame. Nó đã được, nhiều hơn hoặc ít hơn, về việc thêm một Module (numpy) và nghĩ rằng việc sử dụng các chức năng trong cùng một thư viện (gấu trúc) sẽ tốt hơn. Tôi thấy phương pháp của bạn trong thời gian dài là tốt hơn. Cảm ơn @unutbu! – propjk007

1

Hãy thử với:

df.apply(lambda row: row.astype(str).str.contains('TEST').any(), axis=1) 
Các vấn đề liên quan