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,但它有一个与之相关的权重。
不要合并两个groupby操作,而是在对值进行加权后使用命名聚合:
weighted值assign。{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)
| 归档时间: |
|
| 查看次数: |
2275 次 |
| 最近记录: |