[python] 팬더의 데이터 프레임에서 무한 값을 삭제합니까?
재설정하지 않고 팬더 DataFrame에서 nan 및 inf / -inf 값을 삭제하는 가장 빠르고 간단한 방법은 무엇 mode.use_inf_as_null
입니까? 누락 된 것으로 간주 되는 값을 제외하고 의 subset
및 how
인수 를 사용할 수 있기를 원합니다 .dropna
inf
df.dropna(subset=["col1", "col2"], how="all", with_inf=True)
이게 가능해? 결 측값 정의에 dropna
포함시킬 방법이 inf
있습니까?
답변
가장 간단한 방법은 먼저 replace
NaN에 infs를 넣는 것입니다 .
df.replace([np.inf, -np.inf], np.nan)
그런 다음 dropna
:
df.replace([np.inf, -np.inf], np.nan).dropna(subset=["col1", "col2"], how="all")
예를 들면 다음과 같습니다.
In [11]: df = pd.DataFrame([1, 2, np.inf, -np.inf])
In [12]: df.replace([np.inf, -np.inf], np.nan)
Out[12]:
0
0 1
1 2
2 NaN
3 NaN
동일한 방법이 Series에서도 작동합니다.
답변
옵션 컨텍스트를 사용하면 영구적으로 설정하지 않고도 가능합니다 use_inf_as_na
. 예를 들면 다음과 같습니다.
with pd.option_context('mode.use_inf_as_na', True):
df = df.dropna(subset=['col1', 'col2'], how='all')
물론 그것은 치료로 설정할 수 있습니다 inf
로 NaN
영구적으로
pd.set_option('use_inf_as_na', True)
이전 버전의 경우, 교체 use_inf_as_na
와 함께 use_inf_as_null
.
답변
다음은 .loc
Series에서 inf를 nan으로 바꾸는 데 사용 하는 또 다른 방법입니다 .
s.loc[(~np.isfinite(s)) & s.notnull()] = np.nan
따라서 원래 질문에 대한 답변으로 :
df = pd.DataFrame(np.ones((3, 3)), columns=list('ABC'))
for i in range(3):
df.iat[i, i] = np.inf
df
A B C
0 inf 1.000000 1.000000
1 1.000000 inf 1.000000
2 1.000000 1.000000 inf
df.sum()
A inf
B inf
C inf
dtype: float64
df.apply(lambda s: s[np.isfinite(s)].dropna()).sum()
A 2
B 2
C 2
dtype: float64
답변
사용 (빠르고 간단 함) :
df = df[np.isfinite(df).all(1)]
이 답변은 다른 질문에 대한 DougR의 답변 을 기반으로 합니다. 예제 코드는 다음과 같습니다.
import pandas as pd
import numpy as np
df=pd.DataFrame([1,2,3,np.nan,4,np.inf,5,-np.inf,6])
print('Input:\n',df,sep='')
df = df[np.isfinite(df).all(1)]
print('\nDropped:\n',df,sep='')
결과:
Input:
0
0 1.0000
1 2.0000
2 3.0000
3 NaN
4 4.0000
5 inf
6 5.0000
7 -inf
8 6.0000
Dropped:
0
0 1.0
1 2.0
2 3.0
4 4.0
6 5.0
8 6.0
답변
또 다른 해결책은이 isin
방법 을 사용하는 것입니다. 이를 사용하여 각 값이 무한한지 또는 없는지 판별 한 후 all
메소드를 체인화 하여 행의 모든 값이 무한한지 또는 없는지 판별하십시오 .
마지막으로 부울 인덱싱을 통해 무한 또는 누락 된 값이없는 행을 선택하려면 해당 결과의 부정을 사용하십시오.
all_inf_or_nan = df.isin([np.inf, -np.inf, np.nan]).all(axis='columns')
df[~all_inf_or_nan]
답변
위의 솔루션은 inf
대상 열에없는을 수정합니다 . 이를 해결하기 위해
lst = [np.inf, -np.inf]
to_replace = {v: lst for v in ['col1', 'col2']}
df.replace(to_replace, np.nan)
답변
pd.DataFrame.mask
와 함께 사용할 수 있습니다 np.isinf
. 먼저 데이터 프레임 시리즈가 모두 유형인지 확인해야합니다 float
. 그런 다음 dropna
기존 논리와 함께 사용 하십시오.
print(df)
col1 col2
0 -0.441406 inf
1 -0.321105 -inf
2 -0.412857 2.223047
3 -0.356610 2.513048
df = df.mask(np.isinf(df))
print(df)
col1 col2
0 -0.441406 NaN
1 -0.321105 NaN
2 -0.412857 2.223047
3 -0.356610 2.513048