【问题标题】:Compute row percentages in pandas DataFrame?计算 pandas DataFrame 中的行百分比?
【发布时间】:2018-11-22 01:22:49
【问题描述】:

我的数据在 pandas DataFrame 中,如下所示:

cat  val1   val2   val3   val4
A    7      10     0      19
B    10     2      1      14
C    5      15     6      16

我想计算每个值所具有的类别 (cat) 的百分比。

例如,对于A 类别,val1 为 7,总行数为 36。结果值为 7/36,因此val1 是类别 A 的 19.4%。

我的预期结果如下所示:

cat  val1   val2   val3   val4
A    .194   .278   .0     .528
B    .370   .074   .037   .519
C    .119   .357   .143   .381

有没有简单的方法来计算这个?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    div + sum

    对于矢量化解决方案,将axis=0 上的数据框除以axis=1 上的总和。您可以使用set_index + reset_index 忽略标识符列。

    df = df.set_index('cat')
    res = df.div(df.sum(axis=1), axis=0)
    
    print(res.reset_index())
    
      cat      val1      val2      val3      val4
    0   A  0.194444  0.277778  0.000000  0.527778
    1   B  0.370370  0.074074  0.037037  0.518519
    2   C  0.119048  0.357143  0.142857  0.380952
    

    【讨论】:

    • df.div(df.sum(axis=1), axis=0).mul(100).round(3)
    • 这个解决方案比另一个快!
    【解决方案2】:

    您可以使用apply

    df[['val1', 'val2', 'val3', 'val4']] = df[['val1', 'val2', 'val3', 'val4']].apply(lambda x: x/x.sum(), axis=1)
    
    
    >>> df
      cat      val1      val2      val3      val4
    0   A  0.194444  0.277778  0.000000  0.527778
    1   B  0.370370  0.074074  0.037037  0.518519
    2   C  0.119048  0.357143  0.142857  0.380952
    

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 2022-06-13
      • 2022-11-21
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      相关资源
      最近更新 更多