pandas 如何对数据框进行分组并从长到宽进行整形?

mklgxw1f  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(152)

我对Python还是个新手,所以如果这个问题以前有人回答过或者很容易解决,请原谅我。我有一个很长的数据框架,其中包含数值变量和分类变量。它看起来像这样:

Category Detail Gender Weight

 Food     Apple  Female 30   
 Food     Apple  Male   40 
 Beverage Milk   Female 10
 Beverage Milk   Male   5
 Beverage Milk   Male   20 
 Food     Banana Female 50

我想做的是:按类别和细节分组,然后计算所有“女性”和“男性”的示例。然后我想给这些示例加权(见“权重”列)。这应该通过从“权重”列中取值,然后除以总权重来完成。(因此,对于该组:饮料、牛奶、男性,这将是25除以35)。如果有性别的份额也会很好。在一天结束时,我希望我的数据框看起来像这样:

Category Detail Female Male 
Beverage Milk   29%    71%
Food     Apple  43%    57%
Food     Banana 100%   0%

除了分组之外,我还想通过将“女性”和“男性”作为新列添加到数据框中来“解融”数据框。
我可以用groupby对不同级别的权重求和,但如何通过添加这些新列来重塑数据框架呢?
有什么办法可以做到这一点吗?提前感谢您的帮助!

r7knjye2

r7knjye21#

DataFrame.pivot_table用于除以求和值,最后乘以100round

df = df.pivot_table(index=['Category','Detail'],
                    columns='Gender', values='Weight', aggfunc='sum', fill_value=0)
df = df.div(df.sum(axis=1), axis=0).mul(100).round().reset_index()
print (df)
Gender  Category  Detail  Female  Male
0       Beverage    Milk    29.0  71.0
1           Food   Apple    43.0  57.0
2           Food  Banana   100.0   0.0

对于百分比用途:

df = df.pivot_table(index=['Category','Detail'],
                    columns='Gender', values='Weight', aggfunc='sum', fill_value=0)
df = df.div(df.sum(axis=1), axis=0).applymap("{:.2%}".format).reset_index()
print (df)
Gender  Category  Detail   Female    Male
0       Beverage    Milk   28.57%  71.43%
1           Food   Apple   42.86%  57.14%
2           Food  Banana  100.00%   0.00%

相关问题