通过乘法增加特定的行,直到列的总和满足条件

时间:2019-06-25 15:39:02

标签: python python-3.x pandas dataframe

我有一个包含4列的数据框,我想执行以下步骤(最好在一个代码中): -过滤4列总和低于0.9的行 -将每行中的每个单元格相乘,以使该行的总和为0.9 -如果任何单元格中有0,则此单元格保持不变(因为0与任何值的乘积保持为0) -最后显示所有行,以及未更改的行

这是一个示例数据框:

df = pd.DataFrame({'A':[0.03, 0.0, 0.7],
           'B': [0.1234, 0.4, 0.333],
           'C': [0.5, 0.4, 0.0333]})


print (df)
  Name    A    B    C   
0 Bread  0.03 0.1234 0.5000 
1 Butter 0.00 0.4000 0.4000
2 Cheese 0.70 0.3330 0.0333 

Sum = df["A"]+df["B"]+df["C"]
print (Sum)

0    0.6534
1    0.8000
2    1.0663

现在该算法仅影响第0行和第1行

我使用了在这里部分起作用的那个:

df = df4.mul(0.9/df4.sum(axis=1),axis=0)

但是我现在知道如何仅使用A到C列,以及如何首先按总和低于0.9的行过滤,然后如何再次显示所有行。

所以我想要的结果是这样的:

print (df)
   Name     A         B         C
0  Bread    0.0414  0.170292  0.690000
1  Butter   0.0000  0.452000  0.452000
2  Cheese   0.70    0.3330   0.0333

重要的是,所有列(包括产品列)和行仍应存在,并且格式应为包含所有行的数据框。我仅在下面添加了sum函数,以了解它们的总和为0.9或更大。

Sum = df["A"]+df["B"]+df["C"]
    print (Sum)

0    0.9
1    0.9
2    1.0663

2 个答案:

答案 0 :(得分:2)

IIUC

s = df.sum(1)
df.update(df.div(s / .9, axis=0)[s < .9])

df.sum(1)

0    0.9000
1    0.9000
2    1.0663
dtype: float64

答案 1 :(得分:0)

要将中间值保存在新的数据帧php artisan route:list中:

df2

df2 = df.apply(lambda x : x if x.sum() > 0.9 else x.mul(0.9/x.sum()), axis=1) 是:

df2

如果您这样做:

df2
          A         B         C
0  0.041322  0.169972  0.688705
1  0.000000  0.450000  0.450000
2  0.700000  0.333000  0.033300

您得到:

df2.sum(axis=1)