2014-02-21 2 views
0

Я пытаюсь динамически создать новый столбец на основе значений другого столбца. Скажем, у меня есть следующие dataframeСоздание динамического столбца Pandas

A | B
11 | 1
22 | 0
33 | 1
44 | 1
55 | 0

Я хочу создать новый колонка. Если значение столбца B равно 1, вставьте 'Y', иначе вставьте 'N'. Полученный dataframe должно выглядеть так:

A | B | C
11 | 1 | Y
22 | 0 | N
33 | 1 | Y
44 | 1 | Y
55 | 0 | N

Я мог бы сделать это перебором значений столбцов,

for i in dataframe['B'].values: 
    if i==1: 
     add Y to Series 
    else: 
     add N to Series 

dataframe['C'] = Series 

Howe Я боюсь, что это сильно снизит производительность, особенно потому, что мой набор данных содержит 500 000 строк. Любая помощь будет принята с благодарностью. Спасибо.

ответ

3

Избегайте связывания индексации с помощью loc. Есть некоторые тонкости с returning a view versus a copy в панд, которые связаны с numpy

df['C'] = 'N' 
df.loc[df.B == 1, 'C'] = 'Y' 
+0

очень интересно! благодаря! – Zihs

+0

было бы возможно выполнить 2 сравнения, но на другом фрейме данных? 'df.loc [df2.B == 1 и df.A == df2.B, 'C'] = 'Y''? – Zihs

+1

Да. Только вы должны использовать '&' вместо 'and', например:' df.loc [(df2.B == 1) & (df.A == df2.B), 'C'] = 'Y' '. Скобки необходимы, поскольку оператор '&' имеет более высокий приоритет, чем '=='. Кроме того, я считаю, что 'df' и' df2' должны иметь одинаковые индексы для удобной индексации для работы. –

1

Попробуйте это:

df['C'] = 'N' 
df['C'][df['B']==1] = 'Y' 

должен быть быстрее.

+0

работал как шарм! Мне просто нужно было переключить 1 на «1». Большое спасибо! – Zihs

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