使用Panda groupby计算加权平均值并处理NaN

问题描述 投票:0回答:1

我正在尝试使用 groupby 计算加权平均值。但是,我正在处理数据框中的空值。

df = pd.DataFrame({
    'group': ['a', 'a', 'a', 'a'],
    'x': [10, 20, np.nan, 20],
    'weight_x': [10, 15, np.nan, 25],
    'y': [25, 35, 45, np.nan],
    'weight_y': [10, 20, 10, np.nan]
})

这是我的分组功能:

summary = (
    df
    .groupby(['group'])
    .apply(
        lambda x: pd.Series([
            np.average(x['x'], weights=x['weight_x']),
            np.average(x['y'], weights=x['weight_y'])
        ], index=['wt_avg_x', 'wt_avg_y'])
    )
    .reset_index()
)

这个给出了以下输出:

  group  wt_avg_x  wt_avg_y
0     a       NaN       NaN

但是,预期输出应该如下:

  group  wt_avg_x  wt_avg_y
0     a      20.5      35

我已经尝试过这个解决方案:

summary = (
    df.dropna(subset=['x', 'y', 'weight_x', 'weight_y'])
    .groupby(['group'])
    .apply(
        lambda x: pd.Series([
            np.average(x['x'], weights=x['weight_x']),
            np.average(x['y'], weights=x['weight_y'])
        ], index=['wt_avg_x', 'wt_avg_y'])
    )
    .reset_index()
)

但是

dropna
放弃了整行。我怎么能只在
nan
函数中忽略
np.average
值。

python pandas numpy group-by
1个回答
0
投票

一个可能的解决方案

df.groupby('group', as_index=False).apply(
    lambda g: pd.Series({
        'x_weighted_avg': g['x'].dropna().mul(g['weight_x'].dropna()).sum() / g['weight_x'].dropna().sum(),
        'y_weighted_avg': g['y'].dropna().mul(g['weight_y'].dropna()).sum() / g['weight_y'].dropna().sum()
    }), include_groups=False
).reset_index(drop=True)
© www.soinside.com 2019 - 2024. All rights reserved.