열 값을 기준으로 Pandas에서 DataFrame 행 삭제


509

다음과 같은 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. 가장 효율적인 방법은 무엇입니까?


답변:


877

올바르게 이해하고 있다면 다음과 같이 간단해야합니다.

df = df[df.line_race != 0]

16
이 메모리 df가 크면 더 많은 메모리가 필요 합니까? 아니면 제자리에서 할 수 있습니까?
ziyuang

10
df2M 행으로 실행하면 꽤 빨라졌습니다.
Dror

46
@vfxGer 'line race'와 같이 열에 공간이 있다면, 당신은 할 수 있습니다df = df[df['line race'] != 0]
Paul

3
해당 값이 해당 행의 열에있는 경우 전체 행을 삭제하려면이 명령을 어떻게 수정합니까?
Alex

3
감사! Fwiw, 나를 위해 이것은df=df[~df['DATE'].isin(['2015-10-30.1', '2015-11-30.1', '2015-12-31.1'])]

181

그러나 미래의 바이 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()]

4
열 이름을 모르는 경우 어떻게해야합니까?
Piyush S. Wanare

할 수 있었다 df = df[df.columns[2].notnull()] 있지만 어떻게 든 열을 색인 할 수 있어야합니다.
erekalper

1
df = df[df.line_race != 0]행을 삭제하지만 색인을 재설정하지 않습니다. 따라서 df에 다른 행을 추가하면 끝에 추가되지 않을 수 있습니다. 해당 작업 후 색인을 재설정하는 것이 좋습니다 ( df = df.reset_index(drop=True))
the_new_james

==시작하기 위해 연산자 와 없음을 절대 비교해서는 안됩니다 . stackoverflow.com/questions/3257919/…
Bram Vanroy

40

이를 수행하는 가장 좋은 방법은 부울 마스킹을 사용하는 것입니다.

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.query는 매우 유용합니다! 감사! pandas.pydata.org/pandas-docs/version/0.13.1/generated/…
환상적인

14
에 대한 좋은 업데이트입니다 query. 보다 다양한 선택 기준 (예 : df.query('variable in var_list')'var_list'가 원하는 값의 목록 인 경우 와 같은 집합 유사 작업 )을 허용합니다.
philE

1
열 이름에 공백이있는 경우 어떻게해야합니까?
iNoob

2
query열 이름에 공백이 있으면 유용하지 않습니다.
Phillip Cloud

3
헤더에 공백이 생기지 않도록하겠습니다df = df.rename(columns=lambda x: x.strip().replace(' ','_'))
Scientist1642

39

다른 솔루션을 추가하기 위해, 특히 새로운 팬더 평가자를 사용하는 경우에 유용합니다. 다른 솔루션은 원래 팬더를 대체하고 평가자를 잃을 것입니다

df.drop(df.loc[df['line_race']==0].index, inplace=True)

1
인덱스를 작성하고 그 자리를 정하는 목적은 무엇입니까? 누구든지 설명해 주시겠습니까?
heman123


나는 우리가해야 할 거라고 생각 .reset_index()뿐만 아니라 경우 인덱스 접근을 사용하여 사람의 끝
Ayush의

15

여러 열 값을 기준으로 행을 삭제하려면 다음을 사용할 수 있습니다.

df[(df.line_race != 0) & (df.line_race != 10)]

의 값이 0 및 10 인 모든 행을 삭제합니다 line_race.


14

그럼에도 불구하고 주어진 대답은 위의 누군가 df.query('line_race != 0')가 문제에 따라 훨씬 빠른 것을 사용할 수 있다고 말했듯이 정확 합니다. 매우 추천하는.


한 번만 작성하면되기 때문에 DataFrame나와 같은 긴 변수 이름 을 가진 경우 특히 유용합니다 ( df예를 들어 사용 된 것과 비교하여 모든 사람을 추측하려고합니다 ).
ijoseph

9

이전 답변은 내가하려고하는 것과 거의 비슷하지만 색인 방법을 사용하려면 다른 색인 방법 .loc ()을 사용할 필요가 없습니다. 그것은 비슷하지만 정확한 방식으로 수행 할 수 있습니다

df.drop(df.index[df['line_race'] == 0], inplace = True)

1
대규모 데이터 세트 또는 메모리 제약이있는 경우에 적합한 솔루션입니다. +1
davmor

3

그것을하는 또 다른 방법. 코드가 다른 답변에 언급 된 코드보다 조금 더 복잡해 보이지만 여전히 똑같은 작업을 수행하는 가장 효율적인 방법은 아닙니다.

  df = df.drop(df[df['line_race']==0].index)

0

DataFrame에 다른 방법을 추가하면 모든 열에 걸쳐 확장됩니다.

for column in df.columns:
   df = df[df[column]!=0]

예:

def z_score(data,count):
   threshold=3
   for column in data.columns:
       mean = np.mean(data[column])
       std = np.std(data[column])
       for i in data[column]:
           zscore = (i-mean)/std
           if(np.abs(zscore)>threshold):
               count=count+1
               data = data[data[column]!=i]
   return data,count
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.