熊猫找到最大列,从另一列中减去并替换值

时间:2021-01-22 13:59:03

标签: python-3.x pandas

我有一个这样的 df:

 A    |  B     |  C  | D
14    |  5     | 10  | 5
 4    |  7     | 15  | 6
100   | 220    |  6  | 7

对于 A、B、C 列中的每一行,我想要找到最大值并从中减去 D 列并替换它。

预期结果:

 A   |  B   |  C  |  D
 9   |  5   | 10  |  5
 4   |  7   |  9  |  6
100  | 213  |  6  |  7

因此对于第一行,它将选择 14(14、5、10 中的最大值),从中减去 D 列(14-5 = 9)并替换结果(用 9 替换初始值 14)< /p>

我知道如何找到 A、B、C 的最大值并从中减去 D,但我一直在替换部分。

我想把结果放在另一个名为 E 的列中,然后再次找到 A、B、C 的最大值并用列 E 替换,但这没有意义,因为我试图为 a 分配一个值函数调用。还有其他选择吗?

#Exmaple df
list_columns = ['A', 'B', 'C','D']
list_data = [ [14, 5, 10,5],[4, 7, 15,6],[100, 220, 6,7]]
df= pd.DataFrame(columns=list_columns, data=list_data)

#Calculate the max and subctract 
df['e'] = df[['A', 'B']].max(axis=1) - df['D']

#To replace, maybe something like this. But this line makes no sense since it's backwards
df[['A', 'B','C']].max(axis=1) = df['D']

1 个答案:

答案 0 :(得分:1)

使用 DataFrame.mask 仅替换匹配的最大值,将过滤列的所有值与最大值进行比较:

cols = ['A', 'B', 'C']
s =  df[cols].max(axis=1)
df[cols] = df[cols].mask(df[cols].eq(s, axis=0), s - df['D'], axis=0)
print (df)
     A    B   C  D
0    9    5  10  5
1    4    7   9  6
2  100  213   6  7