2015-10-26 2 views
1

Я хочу создать столбец в кадре данных, который условно заполнен значениями. В основном мой dataframe Локс как этотКак добавить условные столбцы в pandas df

Origin  X 
0 Guatemala x 
1 China  x 
2 Kenya  x 
3 Venezuela x 
4 Bangladesh x 

То, что я хочу сделать сейчас, это создать дополнительный столбец «Континент», который добавляет континент в зависимости от страны. Мой результат будет выглядеть следующим образом:

Origin  X Continent 
0 Guatemala x South america 
1 China  x Asia 
2 Kenya  x Africa 
3 Venezuela x South america 
4 Bangladesh x Asia 

Я попытался следующие коды accieve то, что я хочу:

def GetContinents(x): 
    if x['Origin']== 'Thailand' or 'Indonesia' or 'China' or 'Japan' or 'Bangladesh': 
     return 'Asia' 
    elif x['Origin']== 'Boliva' or 'Guatemala' or 'Venezuela' or 'Mexico' or 'Argentinia': 
     return 'South America' 
    elif x['Origin']== 'Guinea Bissau' or 'Egypt' or 'Zaire' or 'Kenya': 
     return 'Africa' 
    else: 
     return 'unknown' 

df['Continent']= df.apply(GetContinents, axis=1) 

Это один заполняет все столбцы «континент» с «Азия» загадочно.

df['Continent'] = np.where(df['Origin'] == 'Bangladesh', 'Asia', 'unknown') 

Это одна отлично работает в условиях, которые он заполняет «Азия» в правой колонке и неизвестно, во все другие, но когда я пытаюсь сделать что-то вроде df['Continent'] = np.where(df['Origin'] == 'Bangladesh' or 'China', 'Asia', 'unknown') я получаю сообщение об ошибке.

Так что в основном мой вопрос: как я могу заполнить мое условие if с разными значениями?

ответ

1

Вы можете создать списки для каждого континента и apply FUNC:

In [35]: 
asia = ['Thailand','Indonesia','China','Japan','Bangladesh'] 
south_america = ['Boliva' , 'Guatemala' , 'Venezuela' , 'Mexico' , 'Argentinia'] 
africa = [ 'Guinea Bissau' , 'Egypt' , 'Zaire' , 'Kenya'] 
def find_continent(x): 
    if x in asia: 
     return 'Asia' 
    elif x in south_america: 
     return 'South America' 
    elif x in africa: 
     return 'Africa' 
    else: 
     return 'Unknown' 
df['Continent'] = df['Origin'].apply(find_continent) 
df 

Out[35]: 
     Origin X  Continent 
0 Guatemala x South America 
1  China x   Asia 
2  Kenya x   Africa 
3 Venezuela x South America 
4 Bangladesh x   Asia 

Или если у вас есть гораздо больше DF, то вы можете просто сделать последовательные вызовы с помощью isin и маскировать строки с помощью loc:

In [38]: 
df.loc[df['Origin'].isin(asia),'Continent'] = 'Asia' 
df.loc[df['Origin'].isin(south_america),'Continent'] = 'South America' 
df.loc[df['Origin'].isin(africa),'Continent'] = 'Africa' 
df['Continent'] = df['Continent'].fillna('Unknown') 
df 

Out[38]: 
     Origin X  Continent 
0 Guatemala x South America 
1  China x   Asia 
2  Kenya x   Africa 
3 Venezuela x South America 
4 Bangladesh x   Asia 

Относительно того, почему ваши попытки не получилось:

if x['Origin']== 'Thailand' or 'Indonesia' or 'China' or 'Japan' or 'Bangladesh' 

Это возвращает True, потому что or 'Indonesia' всегда True, поэтому все строки устанавливаются в Азию.

Вы должны изменить его нравится:

if x['Origin'] in ('Thailand' , 'Indonesia' , 'China' , 'Japan' , 'Bangladesh'): 

Показать похожие: How do I test one variable against multiple values?

np.where Использование было бы хорошо, но вы не маскирует строки, так что вы постоянно перезаписывать строки так, только последний op сохраняется.

+0

Отлично! Спасибо также за объяснения, почему мой код не работал! –

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