熊猫加权统计数据

Mus*_*ger 6 python mean weighted-average dataframe pandas

我有一个如下所示的数据框。

重列本质上代表每个项目的频率,因此对于每个位置,权重总和将等于 1

请记住,这是一个简化的数据集,实际上有超过 100 列,例如value

d = {'location': ['a', 'a', 'b', 'b'],'item': ['x', 'y', 's', 'v'], 'value': [1, 5, 3, 7], 'weight': [0.9, 0.1, 0.8, 0.2]}
df = pd.DataFrame(data=d)
df
  location item value weight
0     a     x     1     0.9
1     a     y     5     0.1
2     b     s     3     0.8
3     b     v     7     0.2
Run Code Online (Sandbox Code Playgroud)

我目前有代码可以计算未加权数据的分组中位数、标准差、偏斜和分位数,我使用以下代码:

df = df[['location','value']]

df1 = df.groupby('location').agg(['median','skew','std']).reset_index()

df2 = df.groupby('location').quantile([0.1, 0.9, 0.25, 0.75, 0.5]).unstack(level=1).reset_index()

dfs = df1.merge(df2, how = 'left', on = 'location')
Run Code Online (Sandbox Code Playgroud)

结果如下:

  location   value
             median skew      std  0.1  0.9 0.25 0.75  0.5
0      a         3  NaN  2.828427  1.4  4.6  2.0  4.0  3.0
1      b         5  NaN  2.828427  3.4  6.6  4.0  6.0  5.0
Run Code Online (Sandbox Code Playgroud)

我想生成与上面完全相同的结果数据框,但是使用该列进行加权统计weight。我该怎么做呢?

需要注意的一个更重要的考虑因素是,有时 为valuenull,但它有一个与之相关的权重。

tdy*_*tdy 2

不要合并两个groupby操作,而是在对值进行加权后使用命名聚合:

  1. 使用生成weightedassign
  2. 聚合使用{output_col: (input_col, agg_function), ...}.
dfs = df.assign(weighted=df.value * df.weight).groupby('location').agg(**{
    'median': ('weighted', 'median'),
    'skew': ('weighted', 'skew'),
    'std': ('weighted', 'std'),
    '0.1': ('weighted', lambda x: x.quantile(0.1)),
    '0.9': ('weighted', lambda x: x.quantile(0.9)),
    '0.25': ('weighted', lambda x: x.quantile(0.25)),
    '0.75': ('weighted', lambda x: x.quantile(0.75)),
    '0.5': ('weighted', lambda x: x.quantile(0.5)),
})
Run Code Online (Sandbox Code Playgroud)

输出:

dfs = df.assign(weighted=df.value * df.weight).groupby('location').agg(**{
    'median': ('weighted', 'median'),
    'skew': ('weighted', 'skew'),
    'std': ('weighted', 'std'),
    '0.1': ('weighted', lambda x: x.quantile(0.1)),
    '0.9': ('weighted', lambda x: x.quantile(0.9)),
    '0.25': ('weighted', lambda x: x.quantile(0.25)),
    '0.75': ('weighted', lambda x: x.quantile(0.75)),
    '0.5': ('weighted', lambda x: x.quantile(0.5)),
})
Run Code Online (Sandbox Code Playgroud)