2017-01-21 7 views
2

'value'열에 값이없는 dataFrame이 있습니다. 각 '이름'그룹 내에서 누락 된 값을 가중 평균으로 채우고 싶습니다. 각 그룹에서 누락 된 값을 단순 평균으로 채우지 만 가중 평균으로 채우지 않는 방법에 대한 글이있었습니다. 고마워요!팬더 : 각 그룹의 가중치로 누락 값을 채우십시오.

df = pd.DataFrame({'value': [1, np.nan, 3, 2, 3, 1, 3, np.nan, np.nan],'weight':[3,1,1,2,1,2,2,1,1], 'name': ['A','A', 'A','B','B','B', 'C','C','C']}) 


    name value weight 
0 A 1.0  3 
1 A NaN  1 
2 A 3.0  1 
3 B 2.0  2 
4 B 3.0  1 
5 B 1.0  2 
6 C 3.0  2 
7 C NaN  1 
8 C NaN  1 

나는 각각의 "이름"그룹의 가중치 값은 「NaN "를 입력하고 싶습니다, 즉

name value weight 
0 A 1.0  3 
1 A 1.5  1 
2 A 3.0  1 
3 B 2.0  2 
4 B 3.0  1 
5 B 1.0  2 
6 C 3.0  2 
7 C 3.0  1 
8 C 3.0  1 

답변

3

할 수 있습니다 그룹 데이터 프레임 name에 의해, 그리고를 채우기 위해 fillna 방법을 사용 weights 매개 변수 np.average 계산할 수없는 가중 된 평균 값 :

df['value'] = (df.groupby('name', group_keys=False) 
       .apply(lambda g: g.value.fillna(np.average(g.dropna().value, weights=g.dropna().weight)))) 

df 
#name value weight 
#0 A 1.0 3 
#1 A 1.5 1 
#2 A 3.0 1 
#3 B 2.0 2 
#4 B 3.0 1 
#5 B 1.0 2 
#6 C 3.0 2 
#7 C 3.0 1 
#8 C 3.0 1 

0,123,516 이 덜 복잡한 만들려면

하는 fillValue 함수를 정의 : 빠른 응답을위한

import numpy as np 
import pandas as pd 

def fillValue(g): 
    gNotNull = g.dropna() 
    wtAvg = np.average(gNotNull.value, weights=gNotNull.weight) 
    return g.value.fillna(wtAvg) 

df['value'] = df.groupby('name', group_keys=False).apply(fillValue) 
+0

감사합니다! 난 변형을 사용하고 아무데도 노력했다. –

+0

계산은 하나의 열만 포함되지만 일반적으로 여기에서 가중 평균을 계산할 경우 일반적으로 변환을 사용할 수 있습니다. 따라서 하나 이상의 열에 액세스하려면 신청이 필요합니다. – Psidom

+0

네, 그렇습니다. Python을 처음 접했을 때, 너무 많이 데리러 왔습니다. 감사! –

관련 문제