다음과 같은 DataFrame이 있습니다.
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
와 line_race
같은 행을 제거해야 합니다 0
. 가장 효율적인 방법은 무엇입니까?
답변
올바르게 이해하고 있다면 다음과 같이 간단해야합니다.
df = df[df.line_race != 0]
답변
그러나 미래의 바이 df = df[df.line_race != 0]
패스의 경우 None
/ missing 값 을 필터링하려고 할 때 아무것도하지 않는 것을 언급 할 수 있습니다.
작동합니다 :
df = df[df.line_race != 0]
아무것도하지 않습니다 :
df = df[df.line_race != None]
작동합니다 :
df = df[df.line_race.notnull()]
답변
이를 수행하는 가장 좋은 방법은 부울 마스킹을 사용하는 것입니다.
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
업데이트 : 이제 팬더 0.13이 나왔습니다. 또 다른 방법은 df.query('line_race != 0')
입니다.
답변
다른 솔루션을 추가하기 위해, 특히 새로운 팬더 평가자를 사용하는 경우에 유용합니다. 다른 솔루션은 원래 팬더를 대체하고 평가자를 잃을 것입니다
df.drop(df.loc[df['line_race']==0].index, inplace=True)
답변
여러 열 값을 기준으로 행을 삭제하려면 다음을 사용할 수 있습니다.
df[(df.line_race != 0) & (df.line_race != 10)]
의 값이 0 및 10 인 모든 행을 삭제합니다 line_race
.
답변
그럼에도 불구하고 주어진 대답은 위의 누군가 df.query('line_race != 0')
가 문제에 따라 훨씬 빠른 것을 사용할 수 있다고 말했듯이 정확 합니다. 매우 추천하는.
답변
이전 답변은 내가하려고하는 것과 거의 비슷하지만 색인 방법을 사용하려면 다른 색인 방법 .loc ()을 사용할 필요가 없습니다. 그것은 비슷하지만 정확한 방식으로 수행 할 수 있습니다
df.drop(df.index[df['line_race'] == 0], inplace = True)