2015-06-04 5 views
1

В Python Pandas DataFrame, я пытаюсь применить конкретную метку к строке, если столбец «Поисковые запросы» содержит любые возможные строки из объединенного списка с разделителями каналов. Как я могу делать условные if, elif, else заявления с Pandas?Python Pandas Dataframe Conditional If, Elif, Else

Например:

df = pd.DataFrame({'Search term': pd.Series(['awesomebrand inc', 'guy boots', 'ectoplasm'])}) 

brand_terms = ['awesomebrand', 'awesome brand'] 
footwear_terms = ['shoes', 'boots', 'sandals'] 

#Note: this does not work 
if df['Search term'].str.contains('|'.join(brand_terms)): 
    df['Label'] = 'Brand' 
elif df['Search term'].str.contains('|'.join(footwear_terms)): 
    df['Label'] = 'Footwear' 
else: 
    df['Label'] = '--' 

Пример требуемый выход:

Search Term   Label 
awesomebrand inc  Brand 
guy boots   Footwear 
ectoplasm   -- 

Я попытался добавление .any() к концам отчетности, но она применяет Brand метки для каждой строки.

Большинство примеров, с которыми я сталкиваюсь, сравнивают, если значение столбца == равно (не то, что я хочу) или выполняет числовые сравнения, а не сравнения строк текста.

+0

'.str.contains()'? Нет необходимости в '.str' part – Zizouz212

ответ

3

Вот один из способов сделать это, используя str.contains() и np.where()

In [26]: 
np.where(df['Search term'].str.contains('|'.join(brand_terms)), 
     'Brand', 
     np.where(df['Search term'].str.contains('|'.join(footwear_terms)), 
      'Footwear', 
      '--')) 

Out[26]: 
array(['Brand', 'Footwear', '--'], 
     dtype='|S8') 

Что вы можете назначить df['Label'] как

In [27]: df['Label'] = np.where(df['Search term'].str.contains('|'.join(brand_terms)), 
    ....:    'Brand', 
    ....:    np.where(df['Search term'].str.contains('|'.join(footwear_terms)), 
    ....:      'Footwear', 
    ....:      '--')) 

In [28]: df 
Out[28]: 
     Search term  Label 
0 awesomebrand inc  Brand 
1   guy boots Footwear 
2   ectoplasm  -- 
+0

Ницца! Это имеет большое значение для меня, исходя из мира Excel и вложенных операторов If. Большое спасибо. – Jarad

+0

Как вы относитесь к одной и той же задаче, не выкинув SetWithCopyWarning? –