2017-03-28 5 views
1

각 행의 마지막 열에있는 값에 대해 데이터 프레임의 0 값을 변경하고 싶습니다. 나는 열 또는 행에 for를 사용하여이 문제를 해결할 수 있지만 나에게 너무 파이썬적인 것처럼 보이지는 않는다. 한마디로조건부로 데이터 프레임의 다른 열에서 값을 할당하십시오.

,이 같은 dataframe이 : 내가 얻을 것

col1 col2 col3 nonzero 
1 2 0 10 
1 0 3 20 

을 나는

df[df==0] = df.nonzero 

같은 작업을 수행하고 싶습니다

col1 col2 col3 nonzero 
    1 2 10 10 
    1 20 3 20 

그러나 [df == 0]은 True/False 값을 가진 DataFrame 자체이므로이 방법은 효과가 없습니다. 어떻게 할 수 있습니까?

df.apply(lambda row: row.where(row != 0, row.iat[-1]), axis=1) 

enter image description here

당신은 또한에 데이터 프레임을 수정할 수 있습니다

답변

1

하나의 옵션은 데이터 프레임의 행을 apply 방법, 루프를 사용하고 행의 마지막 요소로 0을 대체하는 것입니다 장소 :

df[df == 0] = (df == 0).mul(df.nonzero, axis=0) 

위와 동일한 결과로 df이 나온다. 이 방법에서 (df == 0).mul(df.nonzero, axis=0)은 0이 아닌 열의 값과 다른 0으로 대체 된 0 엔트리로 데이터 프레임을 만듭니다. 부울 색인 생성 및 할당과 결합하여, 당신은 조건부 원래 데이터 프레임에서 제로 항목을 수정할 수 있습니다

(df == 0).mul(df.nonzero, axis=0) 

enter image description here

+0

는 안양 == 0.mul 솔루션은 잘 작동하지만, 적용 방법은 준의 나 오류 '객체 유형 클래스에 대해 축 1이 없습니다. 인덱스 col1에서 이 발생했습니다. –

+1

'axis' 매개 변수를 올바르게 배치하지 않았을 수 있습니다.'df'가 'where' 대신'apply' 메소드의 매개 변수로 사용됩니다. 데이터 프레임, Series 객체가 아닙니다. – Psidom

+0

실제로. 아주 멋진 솔루션 –

관련 문제