Python - 在忽略NaN的同时获取Pandas groupby中的加权平均值

时间:2017-03-27 14:21:49

标签: python python-2.7 pandas numpy

我需要按日期对Pandas数据进行分组,然后对给定值进行加权平均。以下是使用边距值作为示例的当前完成方式(并且在NaN值之前它可以正常工作):

df = orders.copy()
# Create new columns as required
df['margin_WA'] = df['net_margin'].astype(float)    # original data as str or Decimal

def group_wa():
        return lambda num: np.average(num, weights=df.loc[num.index, 'order_amount'])

agg_func = {
        'margin_WA': group_wa(),    # agg_func includes WAs for other elements
    }

result = df.groupby('order_date').agg(agg_func)

result['margin_WA'] = result['margin_WA'].astype(str)

如果'net_margin'字段包含NaN值,则WA设置为NaN。在创建新列时,我似乎无法dropna()或按pd.notnull进行过滤,我不知道在哪里创建蒙版数组以避免将NaN传递给{ {1}}函数(this commit)。在这种情况下,如何忽略group_wa

1 个答案:

答案 0 :(得分:0)

我认为一个简单的解决方案是在groupby / aggregate之前删除缺失的值,如:

 result = df.dropna(subset='margin_WA').groupby('order_date').agg(agg_func)

在这种情况下,不会将包含缺失的索引传递给您的group_wa函数。

修改

另一种方法是将dropna移动到聚合函数中,如:

def group_wa(series):
    dropped = series.dropna()
    return np.average(dropped, weights=df.loc[dropped.index, 'order_amount'])

agg_func = {'margin_WA': group_wa}
result = df.groupby('order_date').agg(agg_func)