2016-06-22 2 views
1

원래 모양이 (4361, 15)df이라는 데이터 프레임이 있습니다. agefm 열의 값 중 일부는 NaN입니다. 그냥 보면 :다른 열의 NaN 값을 기반으로 pandas 데이터 프레임의 값을 설정하는 방법은 무엇입니까?

> df[df.agefm.isnull() == True].agefm.shape 
(2282,) 

그럼 내가 영으로 모든 값을 새 열을 생성하고 설정합니다

df['nevermarr'] = 0 

그래서 내가 그 행 agefm에서 다음 1로 nevermarr 값을 설정하려는 것은 할머니는 다음과 같습니다

df[df.agefm.isnull() == True].nevermarr = 1 

아무것도 변경되지 :

> df['nevermarr'].sum() 
0 

내가 뭘 잘못하고 있니?

+0

'df [df.agefm.isnull() == True] .nevermarr = 1'을 실행하면 이미'isnull'의 결과물 인'== True'를 삭제할 수 있습니다. 그런 다음 변경되지 않으면이 메서드는 데이터 프레임의 복사본을 만들기 때문에 있어야합니다. 그런 다음 원래 데이터 프레임이 아닌 라인의 끝에서 사라지는 임시 데이터 프레임을 수정합니다 (그러나 확실하지 않습니다). 어쨌든, Jezrael의 대답은 항상 그렇듯이 좋습니다. – ysearka

+0

@ysearka 좋은 설명 인 것 같습니다.) – Rocketq

답변

2

가장 사용 numpy.where입니다 :

df['nevermarr'] = np.where(df.agefm.isnull(), 1, 0) 
print (df) 
    agefm nevermarr 
0 NaN   1 
1 5.0   0 
2 6.0   0 

또는 사용 loc, ==True 생략 할 수 있습니다

df.loc[df.agefm.isnull(), 'nevermarr'] = 1 

또는 mask :

df['nevermarr'] = df.nevermarr.mask(df.agefm.isnull(), 1) 
print (df) 
    agefm nevermarr 
0 NaN   1 
1 5.0   2 
2 6.0   3 

샘플 :

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'nevermarr':[7,2,3], 
        'agefm':[np.nan,5,6]}) 

print (df) 
    agefm nevermarr 
0 NaN   7 
1 5.0   2 
2 6.0   3 

df.loc[df.agefm.isnull(), 'nevermarr'] = 1 
print (df) 
    agefm nevermarr 
0 NaN   1 
1 5.0   2 
2 6.0   3 
+0

굉장))하지만 왜 원래 코드는 예외로 작동하지 않습니까? – Rocketq

+1

[ysearka] (http://stackoverflow.com/questions/37962759/how-set-values-in-pandas-dataframe-based-on-nan-values-of-another-column/37962791#comment63372972_37962759) 매우 설명해주십시오. 좋은, 고마워. 그리고 더 필요한 경우, [tomaugspurger 블로그 - SettingingCopy'] (http://tomaugspurger.github.io/modern-1.html)를 확인하십시오. – jezrael

관련 문제