판다 데이터 프레임에서 모든 0이 있는 행 삭제
사용할 수 있습니다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.loc[~(df==0).all(axis=1)]
대칭을 좋아하는 사람들에게는 이것도 효과가 있습니다.
df.loc[(df!=0).any(axis=1)]
이것은 벡터화된 방식으로 잘 표현될 수 있는 것으로 나타났습니다.
> 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= df[df['ColName'] != 0]
저는 이 질문을 한 달에 한 번 정도 찾아보고 항상 댓글에서 최선의 답을 찾아내야 합니다.
df.loc[(df!=0).any(1)]
댄 앨런 감사합니다!
0을 다음으로 바꿉니다.nan
그런 다음 모든 항목이 포함된 행을 삭제합니다.nan
그 후 교체nan
영점이 있는
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.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
빠른 사용이 가능합니다.lambda
주어진 행의 모든 값이0
그러면 당신은 그것을 적용한 결과를 사용할 수 있습니다.lambda
해당 조건과 일치하거나 일치하지 않는 행만 선택하는 방법:
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3),
index=['one', 'two', 'three', 'four', 'five'],
columns=list('abc'))
df.loc[['one', 'three']] = 0
print df
print df.loc[~df.apply(lambda row: (row==0).all(), axis=1)]
산출물:
a b c
one 0.000000 0.000000 0.000000
two 2.240893 1.867558 -0.977278
three 0.000000 0.000000 0.000000
four 0.410599 0.144044 1.454274
five 0.761038 0.121675 0.443863
[5 rows x 3 columns]
a b c
two 2.240893 1.867558 -0.977278
four 0.410599 0.144044 1.454274
five 0.761038 0.121675 0.443863
[3 rows x 3 columns]
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
승인된 답변의 예에 따라 보다 우아한 솔루션이 제공됩니다.
df = pd.DataFrame({'a':[0,0,1,1], 'b':[0,1,0,1]})
df = df[df.any(axis=1)]
print(df)
a b
1 0 1
2 1 0
3 1 1
다른 대안:
# Is there anything in this row non-zero?
# df != 0 --> which entries are non-zero? T/F
# (df != 0).any(axis=1) --> are there 'any' entries non-zero row-wise? T/F of rows that return true to this statement.
# df.loc[all_zero_mask,:] --> mask your rows to only show the rows which contained a non-zero entry.
# df.shape to confirm a subset.
all_zero_mask=(df != 0).any(axis=1) # Is there anything in this row non-zero?
df.loc[all_zero_mask,:].shape
이것은 나에게 효과가 있습니다.new_df = df[df.loc[:]!=0].dropna()
이 코드는 다음과 같습니다.df.loc[(df!=0).any(axis=0)]
작동하지 않았습니다.정확한 데이터 세트를 반환했습니다.
대신에, 나는 사용했습니다.df.loc[:, (df!=0).any(axis=0)]
데이터 집합에서 값이 0인 모든 열을 삭제했습니다.
함수.all()
데이터 집합에 0 값이 있는 모든 열을 삭제했습니다.
df = df [~( df [ ['kt' 'b' 'tt' 'mky' 'depth', ] ] == 0).all(axis=1) ]
이 명령을 사용해 보십시오. 완벽하게 작동합니다.
행에 값이 0인 모든 열을 삭제하려면:
new_df = df[df.loc[:]!=0].dropna()
언급URL : https://stackoverflow.com/questions/22649693/drop-rows-with-all-zeros-in-pandas-data-frame
'IT' 카테고리의 다른 글
ggplot2에서 축 제목 및 레이블 크기 변경 (0) | 2023.06.12 |
---|---|
비주얼 스튜디오 코드 컴파일러/디버거를 GCC로 설정하려면 어떻게 해야 합니까? (0) | 2023.06.12 |
printf의 일부 텍스트를 녹색과 빨간색으로 표시 (0) | 2023.06.12 |
VBA를 사용하여 Excel에서 용해/재형성? (0) | 2023.06.12 |
Oracle REPLACE() 함수가 캐리지 리턴 및 라인 피드를 처리하지 않습니다. (0) | 2023.06.12 |