Это происходит потому, что для каждой итерации вашего цикла, вы устанавливаете весь'person'
столбец равным независимо имеет значение; тогда случается, что для последней итерации второе предложение - это игра.
Возможно, вы захотите использовать что-то вроде DataFrame.apply
. Например, в вашем случае, вы могли бы сделать что-то вроде
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
В общем, очень редко в конечном итоге необходимости вручную перебрать ваши Series
/DataFrame
с.
Edit: Обратите также внимание, что для больших DataFrames, приведенный выше код значительно уступает @ решения piRSquared в:
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
Это действительно предлагает огромный прирост производительности уже на полу больших массивов данных; Я добавил пример. – fuglede