Tôi sẽ mở rộng trên giải pháp chung của @ User để cung cấp giải pháp drop
thay thế miễn phí. Điều này dành cho những người được hướng dẫn ở đây dựa trên tiêu đề của câu hỏi (không phải vấn đề của OP)
Giả sử bạn muốn xóa tất cả các hàng có giá trị âm. Một giải pháp lót là: -
df = df[(df > 0).all(axis=1)]
Từng bước giải thích: -
Hãy tạo khung dữ liệu phân phối bình thường ngẫu nhiên 5x5
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,5), columns=list('ABCDE'))
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
1 -0.977278 0.950088 -0.151357 -0.103219 0.410599
2 0.144044 1.454274 0.761038 0.121675 0.443863
3 0.333674 1.494079 -0.205158 0.313068 -0.854096
4 -2.552990 0.653619 0.864436 -0.742165 2.269755
Hãy để điều kiện được xóa tiêu cực. Một df boolean thỏa mãn điều kiện: -
df > 0
A B C D E
0 True True True True True
1 False True False False True
2 True True True True True
3 True True False True False
4 False True True False True
Một chuỗi boolean cho tất cả các hàng thỏa mãn điều kiện Lưu ý nếu bất kỳ phần tử nào trong hàng không thành công thì điều kiện hàng được đánh dấu là false
(df > 0).all(axis=1)
0 True
1 False
2 True
3 False
4 False
dtype: bool
Cuối cùng lọc ra các hàng từ khung dữ liệu dựa trên điều kiện
df[(df > 0).all(axis=1)]
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
2 0.144044 1.454274 0.761038 0.121675 0.443863
Bạn có thể gán lại cho df để thực sự xóa vs bộ lọc được thực hiện ở trên
df = df[(df > 0).all(axis=1)]
Điều này có thể dễ dàng được mở rộng để lọc ra các hàng có chứa NaN (các mục không phải là số): -
df = df[(~df.isnull()).all(axis=1)]
Điều này cũng có thể được đơn giản hóa cho các trường hợp như: Xóa tất cả các hàng trong đó cột E âm
df = df[(df.E>0)]
Tôi muốn kết thúc với một số thống kê định hình về lý do tại sao drop
giải pháp của @ Người dùng chậm hơn so với lọc dựa trên cột thô: -
%timeit df_new = df[(df.E>0)]
345 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit dft.drop(dft[dft.E < 0].index, inplace=True)
890 µs ± 94.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Một cột về cơ bản Series
là một NumPy
mảng, nó có thể được lập chỉ mục mà không phải trả bất kỳ chi phí nào. Đối với những người quan tâm đến cách tổ chức bộ nhớ cơ bản đóng vai trò vào tốc độ thực thi ở đây là một Liên kết tuyệt vời về Tăng tốc Pandas :
df[[(len(x) < 2) for x in df['column name']]]
nhưng của bạn đẹp hơn nhiều. Cảm ơn bạn đã giúp đỡ!