Python 在数据帧中删除相互抵消的数字

Python 在数据帧中删除相互抵消的数字,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个巨大的数据库,其中有一些预算转移,当查看总计时,会相互抵消。问题是,我似乎不明白如何删除所有相互抵消的行。下面的数据框就是一个例子: test=pd.DataFrame(数据=[1050.77,13.45,6.26,--1050.77,10027,6.26,13.45,13.45,--13.45,--6.26,-16800,16800],列=['test']) 上述总和为10060.16 如您所见,以下数字相互抵消: 0 1050.77 3 -1050.77 1 13.45

我有一个巨大的数据库,其中有一些预算转移,当查看总计时,会相互抵消。问题是,我似乎不明白如何删除所有相互抵消的行。下面的数据框就是一个例子:

test=pd.DataFrame(数据=[1050.77,13.45,6.26,--1050.77,10027,6.26,13.45,13.45,--13.45,--6.26,-16800,16800],列=['test'])

上述总和为10060.16

如您所见,以下数字相互抵消:

0   1050.77
3   -1050.77

1   13.45
8   -13.45

2   6.26
9   -6.26

10  -16800
11  16800
因此,期望输出为:

   Test
4   10027
5   6.26
6   13.45
7   13.45
当然,上面的总和是10060.16

我试过很多东西,但都没能成功。下面的代码是我所做的尝试之一,但不起作用:

for idx1, i in enumerate(test['Test']):
    for idx2, j in enumerate(test['Test']):
        if (i + j == 0):
            test.drop(index = idx1, inplace = True)
            test.drop(index = idx2, inplace = True)            
test
我可以删除正在取消另一行的号码,然后使用dropna删除空行,或者,最好的结果是删除该号码有“取消器”的整行

我不关心索引,它可以以任何方式更改

目标是只消除+和-数字的完美匹配

编辑:我编辑了数据框,因此它带有一些浮动


非常感谢您提供有关如何编程的任何帮助。

您应该避免在遍历列表时修改列表。而是创建一个要删除的索引列表,并在找到所有索引后删除它们。此外,为了避免重复删除,您需要在找到匹配项时中断,并继续执行已标记为删除的内容

import pandas as pd

test = pd.DataFrame(data = [3, 2, -4, 2, -3, 3, 2, 6, 7, 5, -6, 6, 3, 3, 4, 4], columns = ['Test'])

dropped = []

for idx1, i in enumerate(test['Test']):
    if idx1 in dropped:
        continue
    for idx2, j in enumerate(test['Test']):
        if idx2 in dropped or idx1 == idx2:
            continue
        if (i + j == 0):
            dropped += [idx1,idx2]
            break
for k in dropped:
    test.drop(index = k, inplace = True)
print(test)

你到底为什么要这么做?您有两行
2
,这也将通过
-4
取消。所以你只考虑取消数字的精确匹配吗?在实际的数据库中,数字有小数,不能被这样的总和。这只是一个例子。我在真实数据库中所做的是一个机器学习算法,在不咨询每个部门的情况下预测下一年的预算,但是那些带有负值的预算转移会破坏算法。目标是消除数字的精确匹配(-and+)如果它们有小数,那么由于浮点错误,您也将很难匹配它们。这将是您的示例中的一个重要细节,因为它可能会导致您的示例的答案出现问题。根据您编辑的评论,我认为您存在XY问题。您不想取消它们,因为浮点舍入IIRC存在问题。在评估两个浮点数是否相等时,需要设置一个精度公差。作为旁注;很高兴您为第一个问题提供了一个简单的示例:)不幸的是,在这种情况下,我认为它掩盖了您的实际问题这是一个系列对象。它们一开始就不应该迭代
import pandas as pd

test = pd.DataFrame(data = [3, 2, -4, 2, -3, 3, 2, 6, 7, 5, -6, 6, 3, 3, 4, 4], columns = ['Test'])

dropped = []

for idx1, i in enumerate(test['Test']):
    if idx1 in dropped:
        continue
    for idx2, j in enumerate(test['Test']):
        if idx2 in dropped or idx1 == idx2:
            continue
        if (i + j == 0):
            dropped += [idx1,idx2]
            break
for k in dropped:
    test.drop(index = k, inplace = True)
print(test)