2 votes

Remplacement conditionnel des valeurs de cellules pandas par des valeurs de cellules d'une autre ligne

J'ai un dataframe pandas pmov avec des colonnes SDRFT et DRFT contenant des valeurs flottantes. Certaines des valeurs DRFT sont 0.0. Lorsque cela se produit, je veux remplacer la valeur DRFT par la valeur SDRFT. À des fins de test, j'ai stocké les lignes où DRFT = 0,0 dans le dataframe df.

J'ai essayé de définir la fonction :

def SDRFT_is_DRFT(row):
    if row['SDRFT'] == row['DRFT']:
        pass
    elif row['SDRFT'] == 0:
        row['SDRFT'] = row['DRFT']
    elif ['DRFT'] == 0:
        row['DRFT'] = row['SDRFT']
    return row[['SDRFT','DRFT']]

et l'appliquer avec : df.apply(SDRFT_is_DRFT, axis=1)

qui revient :

In []: df.apply(SDRFT_is_DRFT, axis=1)
Out[]: 
           SDRFT  DRFT
118    29.500000   0.0
144     0.000000   0.0
212    29.166667   0.0
250    21.000000   0.0
308    21.500000   0.0
317    24.500000   0.0
327    11.000000   0.0
334    31.000000   0.0
347    29.500000   0.0
348    35.000000   0.0

Ce qui n'est pas le résultat que je souhaite.

J'ai également essayé la fonction :

def drft_repl(row):
    if row['DRFT']==0:
        row['DRFT'] = row['SDRFT']

ce qui semble fonctionner pour df.DRFT = df.apply(drft_repl, axis=1)

mais pmov.DRFT = pmov.apply(drft_repl, axis=1) a entraîné le remplacement à 100% des valeurs DRFT par des valeurs SDRFT, sauf lorsque la valeur DRFT était nan.

Comment remplacer conditionnellement les valeurs des cellules d'une colonne par celles d'une autre colonne de la même ligne ?

0voto

MaxU Points 5284

Essayez ceci :

df.loc[df.DRFT == 0, 'DRFT'] = df.SDRFT

0voto

jezrael Points 290608

Je pense que vous pouvez utiliser mask . La première est la colonne remplacée SDRFT avec des valeurs de DRFT où est la condition True et la dernière est remplacée par la colonne DRFT avec des valeurs de SDRFT :

pmov.SDRFT = pmov.SDRFT.mask(pmov.SDRFT == 0, pmov.DRFT)
pmov.DRFT = pmov.DRFT.mask(pmov.DRFT == 0, pmov.SDRFT)
print pmov  
         SDRFT       DRFT
118  29.500000  29.500000
144   0.000000   0.000000
212  29.166667  29.166667
250  21.000000  21.000000
308  21.500000  21.500000
317  24.500000  24.500000
327  11.000000  11.000000
334  31.000000  31.000000
347  29.500000  29.500000
348  35.000000  35.000000

Une autre solution avec loc :

pmov.loc[pmov.SDRFT == 0, 'SDRFT'] = pmov.DRFT 
pmov.loc[pmov.DRFT == 0, 'DRFT'] = pmov.SDRFT 
print pmov  
         SDRFT       DRFT
118  29.500000  29.500000
144   0.000000   0.000000
212  29.166667  29.166667
250  21.000000  21.000000
308  21.500000  21.500000
317  24.500000  24.500000
327  11.000000  11.000000
334  31.000000  31.000000
347  29.500000  29.500000
348  35.000000  35.000000

Pour mieux tester DataFrame a été modifié :

print pmov
     SDRFT   DRFT
118   29.5  29.50
144    0.0   5.98
212    0.0   7.30
250   21.0   0.00
308   21.5   0.00
317    0.0   0.00
327   11.0   0.00
334   31.0   0.00
347   29.5   0.00
348   35.0  35.00

pmov.SDRFT = pmov.SDRFT.mask(pmov.SDRFT == 0, pmov.DRFT)
pmov.DRFT = pmov.DRFT.mask(pmov.DRFT == 0, pmov.SDRFT)
print pmov 
     SDRFT   DRFT
118  29.50  29.50
144   5.98   5.98
212   7.30   7.30
250  21.00  21.00
308  21.50  21.50
317   0.00   0.00
327  11.00  11.00
334  31.00  31.00
347  29.50  29.50
348  35.00  35.00

pmov.loc[pmov.DRFT == 0, 'DRFT'] = pmov.SDRFT 
pmov.loc[pmov.SDRFT == 0, 'SDRFT'] = pmov.DRFT 
print pmov  
     SDRFT   DRFT
118  29.50  29.50
144   5.98   5.98
212   7.30   7.30
250  21.00  21.00
308  21.50  21.50
317   0.00   0.00
327  11.00  11.00
334  31.00  31.00
347  29.50  29.50
348  35.00  35.00

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X