web-dev-qa-db-fra.com

Comment changer les valeurs dans un Python Dataframe

J'ai cherché une réponse au cours des 30 dernières minutes, mais les seules solutions sont soit pour une seule colonne, soit en R. J'ai un jeu de données dans lequel je veux changer les valeurs ('Y/N') en 1 et 0 respectivement. J'ai l'impression que copier et coller le code ci-dessous 17 fois est très inefficace. 

df.loc[df.infants == 'n', 'infants'] = 0
df.loc[df.infants == 'y', 'infants'] = 1
df.loc[df.infants == '?', 'infants'] = 1

Ma solution est la suivante. Cela ne provoque pas d'erreur, mais les valeurs du cadre de données ne changent pas. Je suppose que je dois faire quelque chose comme df = df_new. Mais comment faire ça? 

for coln in df:
for value in coln: 
        if value == 'y':
            value = '1'
        Elif value == 'n':
            value = '0'
        else: 
            value = '1'

EDIT: Il y a 17 colonnes dans cet ensemble de données, mais il y a un autre ensemble de données que j'espère aborder qui contient 56 colonnes. 

republican  n   y   n.1 y.1 y.2 y.3 n.2 n.3 n.4 y.4 ?   y.5 y.6 y.7 n.5 y.8
0   republican  n   y   n   y   y   y   n   n   n   n   n   y   y   y   n   ?
1   democrat    ?   y   y   ?   y   y   n   n   n   n   y   n   y   y   n   n
2   democrat    n   y   y   n   ?   y   n   n   n   n   y   n   y   n   n   y
3   democrat    y   y   y   n   y   y   n   n   n   n   y   ?   y   y   y   y
4   democrat    n   y   y   n   y   y   n   n   n   n   n   n   y   y   y   y
5
handavidbang

Cela devrait fonctionner:

for col in df.columns():
   df.loc[df[col] == 'n', col] = 0
   df.loc[df[col] == 'y', col] = 1
   df.loc[df[col] == '?', col] = 1
2
Luis Miguel

Je pense que le plus simple est d’utiliser replace by dict:

np.random.seed(100)
df = pd.DataFrame(np.random.choice(['n','y','?'], size=(5,5)), 
                                   columns=list('ABCDE'))
print (df)
   A  B  C  D  E
0  n  n  n  ?  ?
1  n  ?  y  ?  ?
2  ?  ?  y  n  n
3  n  n  ?  n  y
4  y  ?  ?  n  n

d = {'n':0,'y':1,'?':1}
df = df.replace(d)
print (df)
   A  B  C  D  E
0  0  0  0  1  1
1  0  1  1  1  1
2  1  1  1  0  0
3  0  0  1  0  1
4  1  1  1  0  0
5
jezrael

Vous pouvez modifier les valeurs à l’aide de la fonction map .

Ex.:

x = {'y': 1, 'n': 0}

for col in df.columns():
    df[col] = df[col].map(x)

De cette façon, vous mappez chaque colonne de votre dataframe.

1
forayer

Peut-être que vous pouvez essayer de postuler,

import pandas as pd
# create dataframe
number = [1,2,3,4,5]
sex = ['male','female','female','female','male']
df_new = pd.DataFrame()
df_new['number'] = number
df_new['sex'] = sex
df_new.head()
# create def for category to number 0/1
def tran_cat_to_num(df):
    if df['sex'] == 'male':
        return 1
    Elif df['sex'] == 'female':
        return 0
# create sex_new 
df_new['sex_new']=df_new.apply(tran_cat_to_num,axis=1)
df_new

brut

   number     sex
0       1    male
1       2  female
2       3  female
3       4  female
4       5    male

après utilisation appliquer

   number     sex  sex_new
0       1    male        1
1       2  female        0
2       3  female        0
3       4  female        0
4       5    male        1
1
Dondon Jie