2017-02-11 11 views
1

Ich benutze diesen Titanic-Datensatz als titanic_df von Kaggle, wo ich eine neue Spalte titanic_df['person'] erstellt habe und gebe die Werte als Kind ein, wenn der Passagier unter 16 ist oder das Geschlecht des Passagiers wenn er/sie ist über 16. Aber die if Bedingung wird nicht überprüft und ['person'] Spalte bekommt das Geschlecht des Passagiers als seine Werte.Wenn Bedingung nicht mit Titanic Kaggle Datensatz funktioniert

Hier ist, was ich getan habe:

titanic_df= pd.read_csv('train.csv') 

for age in titanic_df['Age']: 

     if age < 16 : 

      titanic_df['person']= 'child' 

     if age > 16 : 

      titanic_df['person'] = titanic_df['Sex'] 

print titanic_df[:12] 

Antwort

2

das, weil für jede Iteration der Schleife geschieht, setzen Sie die gesamte'person' Spalte gleich zu sein, was relevant ist; Es kommt dann vor, dass für die letzte Iteration die zweite Klausel diejenige ist, die ins Spiel kommt.

Sie möchten wahrscheinlich etwas wie DataFrame.apply verwenden. Zum Beispiel, in Ihrem Fall, Sie so etwas wie

In [1]: import pandas as pd 
    ...: 
    ...: df = pd.DataFrame() 
    ...: df['Sex'] = ['Male', 'Female', 'Male'] 
    ...: df['Age'] = [15, 20, 50] 
    ...: df 
    ...: 
Out[1]: 
     Sex Age 
0 Male 15 
1 Female 20 
2 Male 50 

In [2]: df['Person'] = df.apply(lambda x: 'Child' if x['Age'] < 16 else x['Sex'], axis=1) 

In [3]: df 
Out[3]: 
     Sex Age Person 
0 Male 15 Child 
1 Female 20 Female 
2 Male 50 Male 

Im Allgemeinen tun, könnte man sehr selten am Ende benötigen Ihre Series/DataFrame s manuell durchlaufen.

Edit: Beachten Sie auch, dass für großen Datenrahmen wird der obige Code stark übertroffen durch @ piRSquared Lösung:

In [41]: n = 10**5 

In [42]: df = pd.DataFrame() 

In [43]: df['Sex'] = np.random.choice(['Male', 'Female'], size=n) 

In [44]: df['Age'] = np.random.randint(1, 100, size=n) 

In [46]: df.head(10) 
Out[46]: 
     Sex Age 
0 Female 15 
1 Female 91 
2 Female 50 
3 Female 11 
4 Female 59 
5 Female 40 
6 Female 50 
7 Male 28 
8 Male 13 
9 Female 27 

In [47]: %timeit np.where(df.Age.values < 16, 'Child', df.Sex.values) 
100 loops, best of 3: 3.06 ms per loop 

In [48]: %timeit df.apply(lambda x: 'Child' if x['Age'] < 16 else x['Sex'], axis=1) 
1 loop, best of 3: 5.73 s per loop 
2

Ich werde wiederholen, was @fuglede sagte über die gesamte Spalte bei jeder Iteration durch Reihen zuweisen. Allerdings ist, unter einem vektorisiert Ansatz bei Ihrer Aufgabe erreicht mit numpy.where

Borrowing @ Fuglede der Beispieldaten

df['Person'] = np.where(df.Age.values < 16, 'Child', df.Sex.values) 
print(df) 

     Sex Age Person 
0 Male 15 Child 
1 Female 20 Female 
2 Male 50 Male 
+0

Die in die Tat bereits auf halb große Datensätze eine enorme Leistungssteigerung anbietet; Ich habe ein Beispiel dazu hinzugefügt. – fuglede

Verwandte Themen