首页 > 解决方案 > 如果列的总和满足条件,则乘以特定行

问题描述

我有一个包含四列的数据框,并且只想将总和小于 0.9 的每行的浮点数乘以相同的数量,直到每行的总和等于 0.9。不应触摸总和已经高于 0.9 的行。

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

原始数据框:


A B C D
0 0.03 0.1234 0.5000 0.8 
1 0.00 0.4000 0.4000 0.2 
2 0.40 0.3330 0.0333 0.2 

列总和:

A: 0.43
B: 0.7564
C: 0.9333
D: 1.2

结果:将列总和低于 0.9 的单元格相乘,使得每列的所有三个单元格的总和为 0.9。重要的是,为 0 的单元格将保持为 0,这不应该被触及。因此,在这种情况下,必须调整 A、B 和 C 列。

标签: pythonpandasdataframe

解决方案


我认为您在行和列之间造成了一些混淆。

import pandas as pd
import numpy as np

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

print(df)

      A       B       C    D
0  0.03  0.1234  0.5000  0.8
1  0.00  0.4000  0.4000  0.2
2  0.40  0.3330  0.0333  0.2

作为df.sum(1)回报

0    1.4534
1    1.0000
2    0.9663
dtype: float64

df.sum()返回

A    0.4300
B    0.8564
C    0.9333
D    1.2000
dtype: float64

因此,如果您只想df.mul(0.9/df.sum())用于总和小于0.9您可以使用的列np.where

out = np.where(df.sum()<0.9, df.mul(0.9/df.sum()), df)
out = pd.DataFrame(out, columns=df.columns)

返回

print(out)

          A         B       C    D
0  0.062791  0.129682  0.5000  0.8
1  0.000000  0.420364  0.4000  0.2
2  0.837209  0.349953  0.0333  0.2

推荐阅读