2017-02-11 8 views
1

Я использую этот набор данных Titanic как titanic_df от Kaggle, где я создал новую колонку titanic_df['person'] и введите значения в качестве ребенка, если пассажир ниже 16 лет или пол пассажира, если он/она выше 16. Но условие if не проверяется, а столбец ['person'] получает пол пассажира в качестве его значений.Если состояние не работает с набором данных Titanic Kaggle

Вот что я сделал:

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] 

ответ

2

Это происходит потому, что для каждой итерации вашего цикла, вы устанавливаете весь'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 
2

я повторить то, что @fuglede сказал о выделении всего столбца на каждой итерации через ряды. Однако, ниже Векторизованный подход при выполнении вашей задачи с использованием выборочных данных numpy.where

Заимствования @ Фугледом в

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

Это действительно предлагает огромный прирост производительности уже на полу больших массивов данных; Я добавил пример. – fuglede

 Смежные вопросы

  • Нет связанных вопросов^_^