Pandas 데이터 프레임에서 모두 0이있는 행 삭제 또는 모든 열이 NA’s’로 설정된 행을

pandas dropna()기능을 사용 하여 일부 또는 모든 열이 NA‘s’로 설정된 행을 제거 할 수 있습니다 . 값이 0 인 모든 열이있는 행을 삭제하는 것과 동일한 기능이 있습니까?

P   kt  b   tt  mky depth
1   0   0   0   0   0
2   0   0   0   0   0
3   0   0   0   0   0
4   0   0   0   0   0
5   1.1 3   4.5 2.3 9.0

이 예에서는 데이터 프레임에서 처음 4 개 행을 삭제하려고합니다.

감사!



답변

이것은 벡터화 된 방식으로 멋지게 표현 될 수 있습니다.

> df = pd.DataFrame({'a':[0,0,1,1], 'b':[0,1,0,1]})
> df = df[(df.T != 0).any()]
> df
   a  b
1  0  1
2  1  0
3  1  1

답변

짧막 한 농담. 조옮김이 필요하지 않습니다.

df.loc[~(df==0).all(axis=1)]

대칭을 좋아하는 사람들에게도 효과가 있습니다 …

df.loc[(df!=0).any(axis=1)]

답변

저는이 질문을 한 달에 한 번 찾아보고 항상 댓글에서 가장 좋은 답변을 찾아야합니다.

df.loc[(df!=0).any(1)]

감사합니다 Dan Allan!


답변

0을 nan로 바꾼 다음 모든 항목이있는 행을 nan. 그 후 nan0으로 대체하십시오 .

import numpy as np
df = df.replace(0, np.nan)
df = df.dropna(how='all', axis=0)
df = df.replace(np.nan, 0)

답변

이 솔루션이 가장 짧다고 생각합니다.

df= df[df['ColName'] != 0]

답변

특히 더 큰 데이터 세트의 경우이를 찾는 동안 도움이되는 몇 가지 솔루션 :

df[(df.sum(axis=1) != 0)]       # 30% faster 
df[df.values.sum(axis=1) != 0]  # 3X faster 

@ U2EF1의 예를 계속합니다.

In [88]: df = pd.DataFrame({'a':[0,0,1,1], 'b':[0,1,0,1]})

In [91]: %timeit df[(df.T != 0).any()]
1000 loops, best of 3: 686 µs per loop

In [92]: df[(df.sum(axis=1) != 0)]
Out[92]:
   a  b
1  0  1
2  1  0
3  1  1

In [95]: %timeit df[(df.sum(axis=1) != 0)]
1000 loops, best of 3: 495 µs per loop

In [96]: %timeit df[df.values.sum(axis=1) != 0]
1000 loops, best of 3: 217 µs per loop

더 큰 데이터 세트에서 :

In [119]: bdf = pd.DataFrame(np.random.randint(0,2,size=(10000,4)))

In [120]: %timeit bdf[(bdf.T != 0).any()]
1000 loops, best of 3: 1.63 ms per loop

In [121]: %timeit bdf[(bdf.sum(axis=1) != 0)]
1000 loops, best of 3: 1.09 ms per loop

In [122]: %timeit bdf[bdf.values.sum(axis=1) != 0]
1000 loops, best of 3: 517 µs per loop

답변

import pandas as pd

df = pd.DataFrame({'a' : [0,0,1], 'b' : [0,0,-1]})

temp = df.abs().sum(axis=1) == 0
df = df.drop(temp)

결과:

>>> df
   a  b
2  1 -1