2016-08-12 2 views
4

у меня есть две колонки возраст и пол в панд dataframeКак сравнить две колонки в пандах, чтобы сделать третий столбец?

sex = ['m', 'f' , 'm', 'f', 'f', 'f', 'f'] 
age = [16 , 15 , 14 , 9 , 8 , 2 , 56 ] 

теперь я хочу, чтобы извлечь третий столбец: как это если возраст < = 9, то вывести «ребенок» и, если возраст> 9, то вывести соответствующий пол

sex = ['m', 'f' , 'm','f' ,'f' ,'f' , 'f'] 
age = [16 , 15 , 14 , 9  , 8  , 2  , 56 ] 
yes = ['m', 'f' ,'m' ,'child','child','child','f' ] 

, пожалуйста, помогите ps. я все еще работаю над этим, если я получить что-нибудь, я буду немедленно обновить

ответ

9

Использование numpy.where:

df['col3'] = np.where(df['age'] <= 9, 'child', df['sex']) 

Полученный выход:

age sex col3 
0 16 m  m 
1 15 f  f 
2 14 m  m 
3 9 f child 
4 8 f child 
5 2 f child 
6 56 f  f 

Timings

Используя следующие настройки для получения более крупного образца. DataFrame:

np.random.seed([3,1415]) 
n = 10**5 
df = pd.DataFrame({'sex': np.random.choice(['m', 'f'], size=n), 'age': np.random.randint(0, 100, size=n)}) 

я получаю следующие тайминги:

%timeit np.where(df['age'] <= 9, 'child', df['sex']) 
1000 loops, best of 3: 1.26 ms per loop 

%timeit df['sex'].where(df['age'] > 9, 'child') 
100 loops, best of 3: 3.25 ms per loop 

%timeit df.apply(lambda x: 'child' if x['age'] <= 9 else x['sex'], axis=1) 
100 loops, best of 3: 3.92 ms per loop 
+0

это работает как этот np.where (состояние, если это сделать, иначе это сделать)? –

+0

Да, это правильно. – root

+0

yup это кажется очень хорошо использовать, хотя df.apply выглядит очень интуитивно понятным :) –

4

Вы можете использовать pandas.DataFrame.where. Например

child.where(age<=9, sex) 
+1

Синтаксис здесь неверен. Если вы хотите использовать 'DataFrame.where', это должно быть примерно так:' df ['sex']. Где (df ['age']> 9, 'child') '. – root

2
df = pd.DataFrame({'sex':['m', 'f' , 'm', 'f', 'f', 'f', 'f'], 
    'age':[16, 15, 14, 9, 8, 2, 56]}) 
df['yes'] = df.apply(lambda x: 'child' if x['age'] <= 9 else x['sex'], axis=1) 

Результат:

age sex yes 
0 16 m  m 
1 15 f  f 
2 14 m  m 
3 9 f child 
4 8 f child 
5 2 f child 
6 56 f  f 
Смежные вопросы