计算 pandas 中的行百分比

Dan*_*ish 5 pandas

我有一个数据框,如下所示

id  val1  val2  val3
a   100   60    40
b   20    18    12
c   160   140   100
Run Code Online (Sandbox Code Playgroud)

对于每一行,我想计算百分比。

预期输出如下图

id  val1  val2  val3
a   50    30    20
b   40    36    24
c   40    35    25
Run Code Online (Sandbox Code Playgroud)

我尝试了以下代码

df['sum'] = df['val1]+df['val2]+df['val3]
df['val1] = df['val1]/df['sum']
df['val2] = df['val2]/df['sum']
df['val3] = df['val3]/df['sum']
Run Code Online (Sandbox Code Playgroud)

我想知道熊猫中是否有比这更简单和替代的方法。

Erf*_*fan 5

我们可以执行以下操作:

  1. 我们用以下方法对正确的列进行切片iloc
  2. 使用applywithaxis=1逐行应用每个计算
  3. 我们使用div,summul将每个值除以行总和并将其乘以 100 以获得整数而不是小数的百分比
  4. 我们将我们的floats背部转换intastype
df.iloc[:, 1:] = df.iloc[:, 1:].apply(lambda x: x.div(x.sum()).mul(100), axis=1).astype(int)
Run Code Online (Sandbox Code Playgroud)

输出

  id  val1  val2  val3
0  a    50    30    20
1  b    40    36    24
2  c    40    35    25
Run Code Online (Sandbox Code Playgroud)

或者一个矢量化解决方案,访问numpy arrays我们的数据框下面。

注意:此方法在速度方面应该表现更好

df.iloc[:, 1:] = (df.iloc[:, 1:] / df.sum(axis=1)[:, None]).mul(100).astype(int)
Run Code Online (Sandbox Code Playgroud)

或类似但使用 pandasDataFrame.div方法:

由乔恩·克莱门茨提出

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

Run Code Online (Sandbox Code Playgroud)

  • 与 numpy 方法类似,您还可以使用 `DataFrame.div` 并显式传递轴,例如: `df.iloc[:, 1:].div(df.iloc[:, 1:].sum(1), axis=0)` 有些人可能会发现更具可读性...... (3认同)