2013-08-11 79 views
229

Tôi có DataFrame sau:Xóa DataFrame hàng trong Pandas dựa trên giá trị cột

   daysago line_race rating  rw wrating 
line_date             
2007-03-31  62   11  56 1.000000 56.000000 
2007-03-10  83   11  67 1.000000 67.000000 
2007-02-10  111   9  66 1.000000 66.000000 
2007-01-13  139   10  83 0.880678 73.096278 
2006-12-23  160   10  88 0.793033 69.786942 
2006-11-09  204   9  52 0.636655 33.106077 
2006-10-22  222   8  66 0.581946 38.408408 
2006-09-29  245   9  70 0.518825 36.317752 
2006-09-16  258   11  68 0.486226 33.063381 
2006-08-30  275   8  72 0.446667 32.160051 
2006-02-11  475   5  65 0.164591 10.698423 
2006-01-13  504   0  70 0.142409 9.968634 
2006-01-02  515   0  64 0.134800 8.627219 
2005-12-06  542   0  70 0.117803 8.246238 
2005-11-29  549   0  70 0.113758 7.963072 
2005-11-22  556   0  -1 0.109852 -0.109852 
2005-11-01  577   0  -1 0.098919 -0.098919 
2005-10-20  589   0  -1 0.093168 -0.093168 
2005-09-27  612   0  -1 0.083063 -0.083063 
2005-09-07  632   0  -1 0.075171 -0.075171 
2005-06-12  719   0  69 0.048690 3.359623 
2005-05-29  733   0  -1 0.045404 -0.045404 
2005-05-02  760   0  -1 0.039679 -0.039679 
2005-04-02  790   0  -1 0.034160 -0.034160 
2005-03-13  810   0  -1 0.030915 -0.030915 
2004-11-09  934   0  -1 0.016647 -0.016647 

tôi cần phải loại bỏ các hàng nơi line_race bằng 0. Cách hiệu quả nhất để làm điều này là gì?

+3

Bản sao có thể có của [Cách xóa hàng khỏi DataFrame gấu trúc dựa trên biểu thức có điều kiện] (http://stackoverflow.com/questions/13851535/how-to-delete-rows-from-a-pandas-dataframe- biểu thức dựa trên điều kiện) – feetwet

Trả lời

428

Nếu tôi hiểu một cách chính xác, nó phải là đơn giản như:

df = df[df.line_race != 0] 
+11

Điều này sẽ tốn nhiều bộ nhớ hơn nếu 'df' lớn? Hoặc, tôi có thể làm điều đó tại chỗ không? – ziyuang

+3

Chỉ cần chạy nó trên một 'df' với 2M hàng và nó đã đi khá nhanh. – Dror

+0

Điều gì sẽ xảy ra nếu line_race có một khoảng trống trong đó? Giống như 'cuộc đua đường'? – vfxGer

30

Cách tốt nhất để làm điều này là với boolean mặt nạ:

In [56]: df 
Out[56]: 
    line_date daysago line_race rating raw wrating 
0 2007-03-31  62   11  56 1.000 56.000 
1 2007-03-10  83   11  67 1.000 67.000 
2 2007-02-10  111   9  66 1.000 66.000 
3 2007-01-13  139   10  83 0.881 73.096 
4 2006-12-23  160   10  88 0.793 69.787 
5 2006-11-09  204   9  52 0.637 33.106 
6 2006-10-22  222   8  66 0.582 38.408 
7 2006-09-29  245   9  70 0.519 36.318 
8 2006-09-16  258   11  68 0.486 33.063 
9 2006-08-30  275   8  72 0.447 32.160 
10 2006-02-11  475   5  65 0.165 10.698 
11 2006-01-13  504   0  70 0.142 9.969 
12 2006-01-02  515   0  64 0.135 8.627 
13 2005-12-06  542   0  70 0.118 8.246 
14 2005-11-29  549   0  70 0.114 7.963 
15 2005-11-22  556   0  -1 0.110 -0.110 
16 2005-11-01  577   0  -1 0.099 -0.099 
17 2005-10-20  589   0  -1 0.093 -0.093 
18 2005-09-27  612   0  -1 0.083 -0.083 
19 2005-09-07  632   0  -1 0.075 -0.075 
20 2005-06-12  719   0  69 0.049 3.360 
21 2005-05-29  733   0  -1 0.045 -0.045 
22 2005-05-02  760   0  -1 0.040 -0.040 
23 2005-04-02  790   0  -1 0.034 -0.034 
24 2005-03-13  810   0  -1 0.031 -0.031 
25 2004-11-09  934   0  -1 0.017 -0.017 

In [57]: df[df.line_race != 0] 
Out[57]: 
    line_date daysago line_race rating raw wrating 
0 2007-03-31  62   11  56 1.000 56.000 
1 2007-03-10  83   11  67 1.000 67.000 
2 2007-02-10  111   9  66 1.000 66.000 
3 2007-01-13  139   10  83 0.881 73.096 
4 2006-12-23  160   10  88 0.793 69.787 
5 2006-11-09  204   9  52 0.637 33.106 
6 2006-10-22  222   8  66 0.582 38.408 
7 2006-09-29  245   9  70 0.519 36.318 
8 2006-09-16  258   11  68 0.486 33.063 
9 2006-08-30  275   8  72 0.447 32.160 
10 2006-02-11  475   5  65 0.165 10.698 

UPDATE: Bây giờ gấu trúc 0,13 là ra, một cách khác để làm điều này là df.query('line_race != 0').

+0

df.query trông rất hữu ích! Cảm ơn! http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.DataFrame.query.html – fantabolous

+10

Cập nhật tốt cho 'truy vấn'. Nó cho phép các tiêu chí lựa chọn phong phú hơn (ví dụ các hoạt động giống như 'df.query ('biến trong var_list')' where 'var_list' là danh sách các giá trị mong muốn) – philE

+0

làm thế nào để đạt được điều này nếu tên cột có không gian trong tên? – iNoob

112

Nhưng đối với bất kỳ người bỏ qua nào trong tương lai, bạn có thể đề cập rằng df = df[df.line_race != 0] không làm bất cứ điều gì khi cố lọc None/thiếu giá trị.

Liệu công việc:

df = df[df.line_race != 0] 

Không làm bất cứ điều gì:

df = df[df.line_race != None] 

Liệu công việc:

df = df[df.line_race.notnull()] 
+1

Có ai biết tại sao trên là đúng? Tại sao không! = Không (hoặc không phải là Không) hoạt động? – eamcvey

+0

Bạn có thể nhận xét về bài đăng của riêng mình @ wonderkid12.Bạn chỉ không thể nhận xét về bài đăng của người khác. –

+0

Cảm ơn rất nhiều, các mục nhập NaN đã bị xóa! –

6

Câu trả lời được đưa ra là đúng Nontheless như một người nào đó ở trên nói rằng bạn có thể sử dụng df.query('line_race != 0') tùy thuộc vào vấn đề của bạn nhanh hơn nhiều. Rất khuyên bạn nên.

Các vấn đề liên quan