2
votes

Remplacement des valeurs dans un dataframe pandas en fonction de plusieurs conditions

J'ai une question assez simple basée sur cet exemple de code:

x1 = 10*np.random.randn(10,3)
df1 = pd.DataFrame(x1)

Je recherche un DataFrame unique dérivé de df1 où les valeurs positives sont remplacées par "up" , les valeurs négatives sont remplacées par "down" et les valeurs 0 , le cas échéant, sont remplacées par "zéro" . J'ai essayé d'utiliser les méthodes .where () et .mask () mais je n'ai pas pu obtenir le résultat souhaité.

J'ai vu d'autres articles qui filtrer en fonction de plusieurs conditions à la fois, mais ils n'indiquent pas comment remplacer des valeurs selon différentes conditions.


1 commentaires

4 Réponses :


4
votes
      0     1     2
0  down    up    up
1    up  down  down
2    up  down  down
3  down  down    up
4  down  down    up
5  down    up    up
6  down    up  down
7    up  down  down
8    up    up  down
9  down    up    up

0 commentaires

3
votes

En général, vous pouvez utiliser np.select sur les valeurs et reconstruire le DataFrame

      0     1     2
0  zero  down    up
1    up  down    up
2    up    up    up
3  down  down  down
4    up    up    up
5    up    up    up
6    up    up  down
7    up    up  down
8  down    up  down
9    up    up  down

Sortie:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(10*np.random.randn(10, 3))
df1.iloc[0, 0] = 0 # So we can check the == 0 condition 

conds = [df1.values < 0 , df1.values > 0]
choices = ['down', 'up']

pd.DataFrame(np.select(conds, choices, default='zero'),
             index=df1.index,
             columns=df1.columns)


0 commentaires

1
votes

Pour plusieurs conditions, par exemple. (df ['employrate'] 50)

utilisez ceci:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

ou vous pouvez également le faire de cette façon,

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

ici, la syntaxe informelle peut être:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

donc la syntaxe que nous avons utilisée ici est:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])

pour une seule condition, ie. ('employrate']> 70)

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

utilisez ceci:

<dataset>.loc[<filter1> & (<filter2>),'<variable>']='<value>'

gm.loc[(gm['employrate'] <55) & (gm['employrate'] > 50),'employrate']=11

donc la syntaxe ici est:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )


0 commentaires

2
votes

Condition IF avec OR

  First_name name_match
0        Jon   Mismatch
1       Bill      Match
2      Maria   Mismatch
3       Emma      Match

Output

from pandas import DataFrame

names = {'First_name': ['Jon','Bill','Maria','Emma']}

df = DataFrame(names,columns=['First_name'])

df.loc[(df['First_name'] == 'Bill') | (df['First_name'] == 'Emma'), 'name_match'] = 'Match'  
df.loc[(df['First_name'] != 'Bill') & (df['First_name'] != 'Emma'), 'name_match'] = 'Mismatch'
print (df)


0 commentaires