islem habibi
islem habibi

Reputation: 21

same value while imputing my data with np.where

I am trying to fill in my data, first, I used the np.where method

df['temp']=np.where(df['nutrition-score-fr_100g'] <=-1,df['nutrition-score-fr_100g'],  'a' )
df['temp']=np.where((df['nutrition-score-fr_100g']>= 0) & (df['nutrition-score-fr_100g']<=2),df['nutrition-score-fr_100g'], 'b')
df['temp']=np.where((df['nutrition-score-fr_100g']>= 3) & (df['nutrition-score-fr_100g']<=10),df['nutrition-score-fr_100g'], 'c')
df['temp']=np.where((df['nutrition-score-fr_100g']>= 11) & (df['nutrition-score-fr_100g']<=18),df['nutrition-score-fr_100g'], 'd')
df['temp']=np.where((df['nutrition-score-fr_100g']>= 19) & (df['nutrition-score-fr_100g']<=40),df['nutrition-score-fr_100g'], 'e')

but unfortunately all df['temp'] values were equal to 'e'

I have tried another method to fill my data and this time I've used a for loop and again unfortunately the same problem persists, all my df['temp'] were equal to 'c' this time

for i in range (0, len(df)): #sans else, affiche la meme valeurs partout
  if df['nutrition-score-fr_100g'][i] <-1:
    df['temp']='a'
  elif df['nutrition-score-fr_100g'][i] in range (0, 3):
    df['temp']='b'
  elif df['nutrition-score-fr_100g'][i] in range (3, 11):
    df['temp']='c'
  elif df['nutrition-score-fr_100g'][i] in range (11, 19):
    df['temp']='d'
  elif df['nutrition-score-fr_100g'][i] in range (19, 41):
    df['temp']='e'

please any help? many thanks

Upvotes: 0

Views: 55

Answers (1)

user19077881
user19077881

Reputation: 5420

Your logic has gone awry. It is better to use pandas .where as below because the logic is simpler; note the ~ character just changes the where condition to True. Hope this helps.

import pandas as pd

df = pd.DataFrame({'nutrition-score-fr_100g': [9, 14, 0, 12, 9] })

df['temp'] = 'X'   # default value
df['temp'].where(~df['nutrition-score-fr_100g'] <=-1,  'nutrition-score-fr_100g' , inplace = True)
df['temp'].where(~(df['nutrition-score-fr_100g']>= 0) & (df['nutrition-score-fr_100g']<=2), 'b', inplace = True)
df['temp'].where(~(df['nutrition-score-fr_100g']>= 3) & (df['nutrition-score-fr_100g']<=10), 'c', inplace = True)
df['temp'].where(~(df['nutrition-score-fr_100g']>= 11) & (df['nutrition-score-fr_100g']<=18), 'd', inplace = True)
df['temp'].where(~(df['nutrition-score-fr_100g']>= 19) & (df['nutrition-score-fr_100g']<=40), 'e', inplace = True)

print(df)

which outputs:

0   1    b
1   9    c
2  14    d
3   0    b
4  12    d
5   9    c

Upvotes: 1

Related Questions