2017-10-05 11 views
2

모든 열의 특이점 대체 I는 예팬더 : 유모

c1,c2,c3 
10000,1,2 
1,3,4 
2,5,6 
3,1,122 
4,3,4 
5,5,6 
6,155,6 

I 밖에 2 시그마 모든 컬럼에서 특이점을 바꾸려 3 열이 데이터 프레임을 가지고있다. 아래 코드를 사용하면 이상 치가없는 데이터 프레임을 만들 수 있습니다.

df[df.apply(lambda x: np.abs(x - x.mean())/x.std() < 2).all(axis=1)] 


c1,c2,c3 
1,3,4 
2,5,6 
4,3,4 
5,5,6 

I 별도로 각 열에 대한 이상 값을 찾을 수 있습니다와 "유모"으로 대체하지만 열 수와 코드 증가의 행의 수와 가장 좋은 방법은 없을 것이다. 이렇게하는 더 좋은 방법이 있어야합니다. 행에 대해 위의 명령에서 부울 출력을 가져온 다음 "TRUE"를 "nan"으로 바꿀 수 있습니다.

모든 의견, 많은 감사.

+0

당신은 당신의 문제가 무엇인지 정확히 설명 할 수 있습니까? Btw 당신은 적용을 제거 할 수 있습니다 -'df [df.sub (df.mean()). abs() .dif (df.std()). lt (2) .all (1)]' –

+0

싶어요. "나노"가있는 데이터 프레임에서 모든 아웃 라이어 (2 시그마 범위를 벗어남)를 대체합니다. 외부 적용 기능을 사용하면 각 열에 대해 별도로 수행해야합니다. – Sridhar

답변

2

pandas
사용 pd.DataFrame.mask

df.mask(df.sub(df.mean()).div(df.std()).abs().gt(2)) 

    c1 c2 c3 
0 NaN 1.0 2.0 
1 1.0 3.0 4.0 
2 2.0 5.0 6.0 
3 3.0 1.0 NaN 
4 4.0 3.0 4.0 
5 5.0 5.0 6.0 
6 6.0 NaN 6.0 

numpy

v = df.values 
mask = np.abs((v - v.mean(0))/v.std(0)) > 2 
pd.DataFrame(np.where(mask, np.nan, v), df.index, df.columns) 

    c1 c2 c3 
0 NaN 1.0 2.0 
1 1.0 3.0 4.0 
2 2.0 5.0 6.0 
3 3.0 1.0 NaN 
4 4.0 3.0 4.0 
5 5.0 5.0 6.0 
6 6.0 NaN 6.0