J'ai cette énorme base de données dans laquelle il y a des transferts budgétaires qui, lorsqu'on regarde le total général, s'annulent mutuellement. Le problème est que je n'arrive pas à comprendre comment je peux supprimer toutes les lignes qui s'annulent. Le cadre de données ci-dessous fonctionne à titre d'exemple :

test = pd.DataFrame(data = [1050.77, 13.45, 6.26, -1050.77, 10027, 6.26, 13.45, 13.45, -13.45, -6.26, -16800, 16800], columns = ['Test'])

    Test
0   1050.77
1   13.45
2   6.26
3   -1050.77
4   10027
5   6.26
6   13.45
7   13.45
8   -13.45
9   -6.26
10  -16800
11  16800

La somme ci-dessus est 10060.16

Comme vous pouvez le voir, les nombres suivants s'annulent :

0   1050.77
3   -1050.77

1   13.45
8   -13.45

2   6.26
9   -6.26

10  -16800
11  16800

Par conséquent, la sortie souhaitée est :

   Test
4   10027
5   6.26
6   13.45
7   13.45

Et bien sûr, la somme ci-dessus est de 10060,16.

J'ai essayé beaucoup de choses et je n'arrive pas à le faire fonctionner. Le code ci-dessous est l'une des tentatives que j'ai faites qui ne fonctionnent pas :

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

Je peux soit supprimer le numéro qui annule l'autre, puis utiliser dropna pour éliminer les lignes vides ou, le meilleur résultat, supprimer toute la ligne que le numéro a un "annulateur"

Je me fiche de l'index, il peut être modifié de n'importe quelle façon.

Le but est d'éliminer uniquement les correspondances parfaites des nombres + et -.

Modifications : j'ai modifié le DataFrame afin qu'il comporte des flotteurs

Toute aide sur la façon de programmer cela serait très appréciée.

0
Guilherme 12 févr. 2020 à 22:37

1 réponse

Meilleure réponse

Vous devez éviter de modifier les listes en les parcourant. Au lieu de cela, créez une liste d'index à supprimer et supprimez-les une fois que vous les avez tous trouvés. De plus, pour éviter les doubles chutes, vous devez vous arrêter lorsque vous trouvez une correspondance et continuer au-delà des choses que vous avez déjà marquées pour être supprimées.

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)
1
kpie 12 févr. 2020 à 19:57