我有一个这样的 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']
答案 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