在熊猫交叉表中,如何计算加权平均值?以及如何添加行和列的总计?

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

我有一个熊猫数据框,其中包含两个分类变量(在我的示例中为城市和颜色),一列带有百分比,一个带有权重。我想做一个城市和颜色的交叉表,显示两者的每种组合的perc加权平均值。

我已经设法通过下面的代码做到这一点,首先创建一个权重为x perc的列,然后创建一个交叉表,其权重之和为(weights x perc),另一个交叉表为权重之和,最后将第一个除以到第二秒。

它有效,但是有没有更快/更优雅的方法?

import pandas as pd
import numpy as np
np.random.seed(123)
df=pd.DataFrame()
myrows=10
df['weight'] = np.random.rand(myrows)*100

np.random.seed(321)
df['perc']=np.random.rand(myrows)
df['weight x perc']=df['weight']*df['perc']
df['colour']=np.where( df['perc']<0.5, 'red','yellow')

np.random.seed(555)
df['city']=np.where( np.random.rand(myrows) <0.5,'NY','LA' )


num=pd.crosstab( df['city'], df['colour'], values=df['weight x perc'], aggfunc='sum', margins=True)
den=pd.crosstab( df['city'], df['colour'], values=df['weight'], aggfunc='sum', margins=True)

out=num/den

print(out)
python pandas crosstab categorical-data
1个回答
3
投票

这里使用带有apply()的groupby和numpy加权平均方法。

df.groupby(['colour','city']).apply(lambda x: np.average(x.perc, weights=x.weight)).unstack(level=0)

给出

colour       red    yellow
city                      
LA      0.173870  0.865636
NY      0.077912  0.687400

虽然我没有全部保留。

这将产生总数

df.groupby(['colour']).apply(lambda x: np.average(x.perc, weights=x.weight))
df.groupby(['city']).apply(lambda x: np.average(x.perc, weights=x.weight))

仍未包装到单个框架中的许可

© www.soinside.com 2019 - 2024. All rights reserved.