【问题标题】:Increase specific rows by multiplication until sum of columns fulfils criteria通过乘法增加特定行,直到列的总和满足条件
【发布时间】:2019-11-07 12:04:50
【问题描述】:

我有一个包含 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

【问题讨论】:

  • 你需要列的中间值吗?我的意思是,如果行的总和

标签: python python-3.x pandas dataframe


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。但是,我不仅希望行的总和为 0.9,而且各个数字仍然存在并且加起来为 0.9。因此,理想情况下,算法会知道它需要将第 0 行中的每个项目与 X 相乘,并将第 1 行中的每个项目与 Y 相乘,以使它们的总和为 0.9。
  • 请注意,我以太阳为证据。数据框应该是这样的
【解决方案2】:

将中间值保存在新的数据框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)

你得到:

0    0.9000
1    0.9000
2    1.0663

【讨论】:

  • m = df.sum(1); np.where(m &gt; 0.9, m, 0.9)
  • @VALentino 感谢您的回答。但我的目标不仅是让行的总和为 0.9,而且各个数字仍然存在并且加起来为 0.9。所以理想情况下,算法会知道它需要将第 0 行中的每个项目与 X 和第 1 行中的 Y 相乘,以使它们的总和为 0.9。
  • @ManuH 固定答案。
猜你喜欢
  • 2019-08-19
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2021-05-13
  • 1970-01-01
  • 2018-11-09
相关资源
最近更新 更多