从计数表中计算相对频率

4

我有一个大的数据框,其中包含数个项目的有效数字,并且想要将它们转换成相对频率。因此,我添加了一列来为每行中的所有列值求和:

product    apple  pear   banana    sum
Jean           3     5        1      9
Phil           2     7        1     10
Yanis          5     4        4     14

接下来,我需要应用公式x/sum(X)*100,以获得数据框中每个值的相对频率,以便获得以下类似的数据框:

product      apple      pear       banana
Jean         33.33     55.55        11.11
Phil            20        70           10
Yanis        37.71     28.57        28.57

我不太清楚如何在不指定每个列的情况下完成此操作(这只是一个小例子的数据集)

我的代码:

df = pd.read_csv(f, sep="\t", index_col='product')
dff = df.transpose()
dff["sum"] = dff.sum(axis=1)

谢谢您提前的支持。
3个回答

2
如果您有这个数据框:
  product  apple  pear  banana
0    Jean      3     5       1
1    Phil      2     7       1
2   Yanis      5     4       4

您可以做到:

df.iloc[:, 1:] = df.iloc[:, 1:].div(df.sum(axis=1), axis=0) * 100
print(df)

输出:

  product      apple       pear     banana
0    Jean  33.333333  55.555556  11.111111
1    Phil  20.000000  70.000000  10.000000
2   Yanis  38.461538  30.769231  30.769231

2

假设df的方向为:

         apple  pear  banana
product                     
Jean         3     5       1
Phil         2     7       1
Yanis        5     4       4

只需使用:

df.div(df.sum(axis=1), axis=0)*100
>>
             apple       pear     banana
product                                 
Jean     33.333333  55.555556  11.111111
Phil     20.000000  70.000000  10.000000
Yanis    38.461538  30.769231  30.769231

0

打印(df)

   product  apple  pear  banana  sum
0    Jean      3     5       1    9
1    Phil      2     7       1   10
2   Yanis      5     4       4   14 

解决方案

  df.drop(columns=['sum']).set_index('product').apply(lambda x: ((x/x.sum())*100).round(2), axis=1).reset_index()



product apple   pear    banana
0   Jean    33.33   55.56   11.11
1   Phil    20.00   70.00   10.00
2   Yanis   38.46   30.77   30.77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接