2017-10-15 1 views
2

열 a가 NaN이 아닌 동일한 열에 있으면 열 b의 모든 NaN 요소를 1로 변경하려고했습니다. 예 : a == 1 b == NaN, b를 1로 변경하십시오. 여기에 제 코드가 있습니다.튜플에 apply 속성을 사용하는 방법

raw_data['b'] = ((raw_data['a'],raw_data['b']).apply(condition)) 

def condition(a,b): 
if a != None and b == None: 
    return 1 

그리고 AttributeError가 있습니다. '튜플'객체에는 '적용'속성이 없습니다. 이 상황에서 내가 사용할 수있는 다른 방법은 무엇입니까?

+0

작동 할 수있는 경우 낸피 랑 잘 지냈어. –

답변

3

isnullnotnull을 사용하여 &으로 연결된 조건으로 부울 마스크를 만듭니다.

mask = raw_data['a'].notnull() & raw_data['b'].isnull() 
raw_data['b'] = raw_data['b'].mask(mask, 1) 

또는 :

raw_data.loc[mask, 'b'] = 1 

또는 :

mask, loc 또는 numpy.where와 -

그런 다음 1를 추가 더 가능한 해결책이다

샘플 : 행으로 처리 axis=1apply이 필요합니다 (더 많은 데이터가 있다면 정말 느린) 사용자 정의 기능을 사용하려면

가 :

raw_data = pd.DataFrame({ 
    'a': [1,np.nan, np.nan], 
    'b': [np.nan, np.nan,2] 
}) 
print (raw_data) 
    a b 
0 1.0 NaN 
1 NaN NaN 
2 NaN 2.0 

mask = raw_data['a'].notnull() & raw_data['b'].isnull() 

print (mask) 
0  True 
1 False 
2 False 
dtype: bool 

raw_data.loc[mask, 'b'] = 1 

print (raw_data) 
    a b 
0 1.0 1.0 
1 NaN NaN 
2 NaN 2.0 

편집

def condition(x): 
    if pd.notnull(x.a) and pd.isnull(x.b): 
     return 1 
    else: 
     return x.b 

raw_data['b'] = raw_data.apply(condition, axis=1) 

print (raw_data) 
    a b 
0 1.0 1.0 
1 NaN NaN 
2 NaN 2.0 
관련 문제