如果列的总和满足条件,则乘以特定的行

时间:2019-06-25 12:54:50

标签: python pandas dataframe

我有一个包含四列的数据框,只想将总和小于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列。

1 个答案:

答案 0 :(得分:0)

我认为您正在使行和列之间有些混乱。

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