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
Die in die Tat bereits auf halb große Datensätze eine enorme Leistungssteigerung anbietet; Ich habe ein Beispiel dazu hinzugefügt. – fuglede