2017-11-11 2 views
1

각 행이 단일 의사 방문을 나타내고 각 열에 단일 진단 테스트의 데이터가 포함 된 DataFrame이 있습니다. 데이터가 불완전하고 누락 된 값이 NaN으로 채워집니다.pandas의 NaN 교체 행 항목을 기반으로하는 DataFrame

 AGE Height  SEX Weight 
0 79  40 Male  90 
1 79  21 Male  20 
2 79 NaN Male  50 
3 79  89 Male NaN 
4 79  90 Male  57 
5 81  87 Female NaN 
6 81 NaN Female  89 
7 81  54 Female  79 
8 81  21 Female NaN 
9 81  23 Female  23 

나는 인구 각 NaN의 교체 같은 성별과 연령의 환자를 의미 할 : 여기

는 단순화 된 예입니다. 내가 가진 모든 연령과 성별 조합에 대한 수단을 포함하는 DataFrame을 만들 수있었습니다 다음

다음 DataFrame 산출
age_sex_means = df.groupby(['SEX', 'AGE'])['Height','Weight'].mean() 

: 내가하는 방법을 찾을 수 없습니다

   Height Weight 
SEX AGE     
Female 81  37.0 38.2 
Male 79  48.0 43.4 

하지만를 첫 번째 DataFrame의 NaN을 두 번째 DataFrame에 포함 된 수단으로 대체합니다. Using Pandas to fill NaN entries based on values in a different column, using a dictionary as a guide 모두 내 것과 비슷한 상황을 처리하는 것처럼 보이지만 내 정확한 경우에는 분명히 작동하지 않는 색인이 하나뿐입니다.

답변

1

당신은 사본

df.combine_first(df.groupby(['SEX', 'AGE']).transform('mean')) 

    AGE Height  SEX  Weight 
0 79 40.00 Male 90.000000 
1 79 21.00 Male 20.000000 
2 79 60.00 Male 50.000000 
3 79 89.00 Male 54.250000 
4 79 90.00 Male 57.000000 
5 81 87.00 Female 63.666667 
6 81 46.25 Female 89.000000 
7 81 54.00 Female 79.000000 
8 81 21.00 Female 63.666667 
9 81 23.00 Female 23.000000 
을 생산하는 applyfillna

df.groupby(['AGE', 'SEX'], group_keys=False).apply(lambda x: x.fillna(x.mean())) 

    AGE Height  SEX  Weight 
0 79 40.00 Male 90.000000 
1 79 21.00 Male 20.000000 
2 79 60.00 Male 50.000000 
3 79 89.00 Male 54.250000 
4 79 90.00 Male 57.000000 
5 81 87.00 Female 63.666667 
6 81 46.25 Female 89.000000 
7 81 54.00 Female 79.000000 
8 81 21.00 Female 63.666667 
9 81 23.00 Female 23.000000 

옵션 2
사용 transformcombine_first과 함께 사용할 수있는 1

옵션 와 fillna

df.fillna(df.groupby(['SEX', 'AGE']).transform('mean')) 

    AGE Height  SEX  Weight 
0 79 40.00 Male 90.000000 
1 79 21.00 Male 20.000000 
2 79 60.00 Male 50.000000 
3 79 89.00 Male 54.250000 
4 79 90.00 Male 57.000000 
5 81 87.00 Female 63.666667 
6 81 46.25 Female 89.000000 
7 81 54.00 Female 79.000000 
8 81 21.00 Female 63.666667 
9 81 23.00 Female 23.000000 

옵션 4
또는 장소에서 편집과


옵션 3
똑같은 update

df.update(df.groupby(['SEX', 'AGE']).transform('mean')) 
df 

    AGE Height  SEX  Weight 
0 79 40.00 Male 90.000000 
1 79 21.00 Male 20.000000 
2 79 60.00 Male 50.000000 
3 79 89.00 Male 54.250000 
4 79 90.00 Male 57.000000 
5 81 87.00 Female 63.666667 
6 81 46.25 Female 89.000000 
7 81 54.00 Female 79.000000 
8 81 21.00 Female 63.666667 
9 81 23.00 Female 23.000000