Ich habe in den letzten 30 Minuten nach einer Antwort gesucht, aber die einzigen Lösungen sind entweder für eine einzelne Spalte oder in R. Ich habe einen Datensatz, in dem ich die ('Y/N') - Werte in 1 und 0 ändern möchte beziehungsweise. Ich fühle mich wie das Kopieren und Einfügen des Codes unter 17-mal ist sehr ineffizient.
df.loc[df.infants == 'n', 'infants'] = 0
df.loc[df.infants == 'y', 'infants'] = 1
df.loc[df.infants == '?', 'infants'] = 1
Meine Lösung ist die folgende. Dies verursacht keinen Fehler, aber die Werte im Datenrahmen ändern sich nicht. Ich gehe davon aus, dass ich so 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'
BEARBEITEN: Es gibt 17 Spalten in diesem Datensatz, aber es gibt noch einen anderen Datensatz, den ich hoffe zu lösen, der 56 Spalten enthält.
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
Das 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
Am einfachsten finde ich die Verwendung von 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
Dies sollte tun:
df.infants = df.infants.map({ 'Y' : 1, 'N' : 0})
Sie können die Werte mit der Map-Funktion ändern.
Ex.:
x = {'y': 1, 'n': 0}
for col in df.columns():
df[col] = df[col].map(x)
Auf diese Weise ordnen Sie jede Spalte Ihres Datenrahmens zu.
Vielleicht können Sie sich bewerben,
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 anwenden
number sex sex_new
0 1 male 1
1 2 female 0
2 3 female 0
3 4 female 0
4 5 male 1
Alle oben genannten Lösungen sind korrekt, aber Sie können auch Folgendes tun:
df["infants"] = df["infants"].replace("Y", 1).replace("N", 0).replace("?", 1)
, das ich jetzt genauer lese, ist der Verwendung von replace with dict sehr ähnlich!