Python 如何仅在减法匹配时转换?

Python 如何仅在减法匹配时转换?,python,pandas,dataframe,numpy,Python,Pandas,Dataframe,Numpy,假设您拥有以下df: d = {'line amount#1': [10, 10], 'line amount#2': [10, 10], 'btw-amount#1': [5, 5],'btw-amount#2': [5,4], 'ExclBTW':[10, 10]} dfcount = pd.DataFrame(data=d) dfcount +----+-----------------+-----------------+----------------+---------------

假设您拥有以下df:

d = {'line amount#1': [10, 10], 'line amount#2': [10, 10], 'btw-amount#1': [5, 5],'btw-amount#2': [5,4], 'ExclBTW':[10, 10]}
dfcount = pd.DataFrame(data=d)
dfcount

+----+-----------------+-----------------+----------------+----------------+-----------+
|    |   line amount#1 |   line amount#2 |   btw-amount#1 |   btw-amount#2 |   ExclBTW |
|----+-----------------+-----------------+----------------+----------------+-----------|
|  0 |              10 |              10 |              5 |              5 |        10 |
|  1 |              10 |              10 |              5 |              4 |        10 |
+----+-----------------+-----------------+----------------+----------------+-----------+
我想要的是从行金额列中减去btw金额列,看看它们是否等于exclusBTW。当他们这样做时,我想更新行数量值

首先,我想检查行金额是否等于exclubtw而不减去:

lines = dfcount.filter(like="line am")
btwam = dfcount.filter(like="btw-amount").columns
m = lines.sum(axis=1).ne(dfcount["ExclBTW"].astype(float))

dfcount[lines.columns] = lines.mask(m)
dfcount
现在我得到以下输出:

+----+-----------------+-----------------+----------------+----------------+-----------+
|    |   line amount#1 |   line amount#2 |   btw-amount#1 |   btw-amount#2 |   ExclBTW |
|----+-----------------+-----------------+----------------+----------------+-----------|
|  0 |             nan |             nan |              5 |              5 |        10 |
|  1 |             nan |             nan |              5 |              4 |        10 |
+----+-----------------+-----------------+----------------+----------------+-----------+
现在它转换为Nan,但是只有当减法等于ExclBTW列时,如何将其转换为减去的金额(行金额-btw金额)

期望输出:

+----+-----------------+-----------------+----------------+----------------+-----------+
|    |   line amount#1 |   line amount#2 |   btw-amount#1 |   btw-amount#2 |   ExclBTW |
|----+-----------------+-----------------+----------------+----------------+-----------|
|  0 |             5   |              5  |              5 |              5 |        10 |
|  1 |             10  |             10  |              5 |              4 |        10 |
+----+-----------------+-----------------+----------------+----------------+-----------+
请帮忙

lines=dfcount.filter(比如=“line”)
btws=dfcount.filter(类似于“btw”)
cond=(行数总和(1)-btws.sum(1)).eq(dfcount.exclusbtw)
新线路=np.其中(np.c[cond],BTW,线路)
dfcount.loc[:,line.columns]=新的\u行
得到

   line amount#1  line amount#2  btw-amount#1  btw-amount#2  ExclBTW
0              5              5             5             5       10
1             10             10             5             4       10

我们形成
条件
条件,然后从
btws
中获取值,其中
为真,而
为假。然后我们将结果放回
dfcount
np.c[cond]
部分是强制播放
cond
关于
btw
line
行的内容。

您能否详细说明
只有在减法等于exclubbtw列时,如何将其转换为减去的金额(line amount-btw amount)?
当然可以。当减法等于exclubtw列时,我想将行金额值转换为新值行金额-btw金额。我认为Mustafa已经很好地研究了这个问题。但是,当运行他的代码时,我得到的是btw数量,而不是两列之间的减法谢谢你的评论,这适用于所述的值,但是与浮点值有问题。你知道如何缓解这一问题吗?@Max你能详细说明这些问题吗,这是具体的浮点精度算法吗?如果是这样,您能否尝试
cond=np.isclose(lines.sum(1)-btws.sum(1),dfcount.exclubtw)
?@Max如果您有不同数量的
line
btw
列,您期望的输出是什么?我猜你的最后一个结果表明你有4个行列和2个btw列。但是我的问题是在4行列中放置什么,所以它们总是相等的。我编辑了您的代码并添加了like=“line amount”和like=“btw amount”。然后我添加了line.to_numpy()-btws,现在它工作正常。非常感谢。