我有一个数据框,如下所示
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)
我想知道熊猫中是否有比这更简单和替代的方法。
我们可以执行以下操作:
ilocapplywithaxis=1逐行应用每个计算div,sum和mul将每个值除以行总和并将其乘以 100 以获得整数而不是小数的百分比floats背部转换int为astypedf.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)
| 归档时间: |
|
| 查看次数: |
4269 次 |
| 最近记录: |