2017-07-13 1 views
3

Ich habe nach einer Antwort für die letzten 30 min gesucht, aber die einzigen Lösungen sind entweder für eine einzelne Spalte oder in R. Ich habe ein Dataset, in dem ich die ('Y/N') Werte auf 1 bzw. 0. Ich fühle mich wie Kopieren und Einfügen des Codes unter 17 mal ist sehr ineffizient.Wie Werte in einem Datenrahmen ändern Python

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

Meine Lösung ist das Folgende. Dies verursacht keinen Fehler, aber die Werte im Datenrahmen ändern sich nicht. Ich gehe davon aus, dass ich etwas wie df = df_new machen muss. Aber wie geht das?

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

EDIT: Es gibt 17 Spalten in diesem Datensatz, aber es ist ein weiteres Daten-Set Ich hoffe, in Angriff zu nehmen, die 56 Spalten enthält.

republikanisch 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 republikanisch n y y y y n n n n y y y n? 1 Demokrat? y y? y y n n n n y n y n n 2 democrat y y n? y n n n n y n y n n 3 democrat y y y n y y n n n y? y y y y 4 democrat y y y n n n n n y y y y

+0

, wie viele Spalten wollen Sie ändern? Können Sie df.head() anzeigen? –

+0

Es gibt 17 Spalten in diesem Datensatz, aber es gibt einen anderen mit 56. – handavidbang

Antwort

2

Dies sollte funktionieren:

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 
+1

Danke, das hat funktioniert! – handavidbang

+0

Danke @handavidbang –

1

Sie können die Werte mit der map function ändern.

Bsp .:

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

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

diese Weise können Sie jede Spalte Ihrer Datenrahmen zugeordnet werden.

+0

Würde ich das für jede Spalte tun müssen? Der Datensatz, mit dem ich gerade arbeite, hat nur 17 Spalten, aber ich kann sehen, dass dies für mein Abschlussprojekt mit 56 Spalten problematisch ist. – handavidbang

+0

danke! Es hat nicht funktioniert, aber ich denke es ist, weil sich mein Datensatz geändert hat, bevor Sie Ihre Vorschläge gemacht haben. Ich habe es jetzt im Laufen! – handavidbang

0

Vielleicht können Sie versuchen, anwenden,

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 

roh

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

nach Gebrauch

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

Dies sollte tun:

df.infants = df.infants.map({ 'Y' : 1, 'N' : 0})

1

ich simpliest denken ist verwenden replace von 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 
Verwandte Themen