熊猫:按每组加权平均值填充缺失值

时间:2017-01-21 18:34:39

标签: python pandas missing-data weighted-average

我有一个dataFrame,其中'value'列缺少值。我想在每个“名称”组中按加权平均值填充缺失值。有关如何通过每组中的简单平均值填充缺失值而不是加权平均值的帖子。非常感谢!

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

1 个答案:

答案 0 :(得分:3)

您可以按name对数据框进行分组,并使用fillna方法使用加权平均值填充缺失值,加权平均值可以使用np.average weights参数计算:

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

为了减少错综复杂,定义一个 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)