Python 如何仅在减法匹配时转换?
假设您拥有以下df: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 +----+-----------------+-----------------+----------------+---------------
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,现在它工作正常。非常感谢。