2014-09-08 3 views
3

나는 np.where를 좋아하지만 그걸 완전히 파악하지 못했습니다.np.where를 사용하지만 조건이 거짓 일 때 기존 값 유지

import pandas as pd 
import numpy as np 
from numpy import nan as NA 
DF = pd.DataFrame({'a' : [ 3, 0, 1, 0, 1, 14, 2, 0, 0, 0, 0], 
        'b' : [ 3, 0, 1, 0, 1, 14, 2, 0, 0, 0, 0], 
        'c' : [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
        'd' : [5, 1, 2 ,1, 1 ,22, 30, 1, 0, 0, 0]}) 

지금 내가하고 싶은 모든 행 값이 제로 일 때 NaN의 값으로 0 값을 대체 할 수 있습니다 :

나는 dataframe 그것은 다음과 같습니다 말할 수 있습니다. 비판적으로 모든 행 값이 0이 아닌 경우 다른 행의 값이 유지 되길 원합니다.

나는 이런 식으로 뭔가를 할 :

cols = ['a', 'b', 'c', 'd'] 
condition = (DF[cols] == 0).all(axis=1) 
for col in cols: 
    DF[col] = np.where(condition, NA, ???) 

내가 넣어 ??? 조건이 거짓이면 어떤 값을 넣을지 모르겠다는 것을 나타 내기 위해 이미 존재하는 것만 보존하려고합니다. np.where에서 가능합니까? 아니면 다른 기술을 사용해야합니까?

+0

아마도 이것이 가장 좋은 방법은 사실이다 : 당신이 당신의 예를 변경, DF[col]???을 대체 할 수 있도록 riginal 문제는 np.where 같은 broadcasting rules 같은 다른 배열 작업을 다음? "DF.loc [DF [(DF [cols] == 0) .all (axis = 1)]. index, cols] = NA' –

답변

3

정확히이 종류의 작업에 메서드 (부수적으로 where)가 있습니다. 처음에는 조금 뒤로 보였지만 문서에서는 보입니다.

Series.where (COND 다른 = NaN의 인플레 이스 = 거짓, 축 = 없음, 레벨 = 없음, try_cast = 거짓, raise_on_error = TRUE) 자체와 동일한 형상의

복귀 개체 해당 항목이 self에서 나온 것입니다. 여기서 cond는 True 이고 그렇지 않으면 other입니다. 당신이하려는 모든 NA과 열의 특정 세트의 모든 제로의 행을 대체 할 경우

그래서, 당신의 예는,

cols = ['a', 'b', 'c', 'd'] 
condition = (DF[cols] == 0).all(axis=1) 
for col in cols: 
    DF[col].where(~condition, np.nan, inplace=True) 

될 그러나 것이다, 당신이 대신

을 할 수
DF.loc[condition, cols] = NA 

편집

당신의 오 답변을

cols = ['a', 'b', 'c', 'd'] 
condition = (DF[cols] == 0).all(axis=1) 
for col in cols: 
    DF[col] = np.where(condition, NA, DF[col]) 
관련 문제