我有一个如下所示的数据框
id val1 val2 val3
a 100 60 40
b 20 18 12
c 160 140 100
我要为每一行计算百分比。
预期输出如下所示
id val1 val2 val3
a 50 30 20
b 40 36 24
c 40 35 25
我尝试了以下代码
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']
我想知道在大熊猫中,有什么比这更简单和替代的方法了。
答案 0 :(得分:3)
我们可以执行以下操作:
iloc
切出正确的列apply
与axis=1
配合使用,以明智地应用每个计算行div
,sum
和mul
将每个值除以行总和,然后将其乘以100,以得到整数而不是小数的百分比floats
将int
转换回astype
df.iloc[:, 1:] = df.iloc[:, 1:].apply(lambda x: x.div(x.sum()).mul(100), axis=1).astype(int)
输出
id val1 val2 val3
0 a 50 30 20
1 b 40 36 24
2 c 40 35 25
或矢量化解决方案,访问我们数据框下方的numpy arrays
。
注意:这种方法在速度方面应该表现更好
df.iloc[:, 1:] = (df.iloc[:, 1:] / df.sum(axis=1)[:, None]).mul(100).astype(int)
或类似但使用熊猫DataFrame.div
方法:
乔恩·克莱门茨的提议
df.iloc[:, 1:] = df.iloc[:, 1:].div(df.iloc[:, 1:].sum(1), axis=0).mul(100)