2016-12-07 1 views
2

Новое для Python & Pandas.создать новую колонку на основе условного тестирования регулярного выражения в pandas

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

См., Например,

У меня есть ДФ:

df = pd.DataFrame({'foodstuff':['apple-martini', 'apple-pie', 'lemon-merengue', 'strawberry-tart'], 'type':['cocktail', 'dessert', 'dessert', 'dessert']}) 

и у меня есть две строки регулярных выражений:

fruit = "apple|mango|banana|peach" 

recipe = "cocktail|dessert|appetizer" 

Я хочу отвечать следующим условиям:

df['foodstuff'].str.contains(fruit, case = False) & (df['type'].str.contains(recipe, case = False)) 

В этом случае, выход будет выглядеть так:

pd.DataFrame({'foodstuff':['apple-martini', 'apple-pie', 'lemon-merengue', 'strawberry-tart'], 'type':['cocktail', 'dessert', 'dessert', 'dessert'], 'tag':['apple', 'apple', np.nan, np.nan ]}) 

Я пытался сделать это следующим образом:

df['tag'] = np.where(df['foodstuff'].str.contains(fruit), fruit, np.nan) 

, но в этом случае столбец «тег» принимает все значения строки: apple|mango|banana|peach. Мне нужна только часть, которая соответствует.

ответ

2

Я думаю, что вам нужно str.extract:

fruit = "apple|mango|banana|peach" 
df['tag'] = df.foodstuff.str.extract('('+fruit+')', expand=False) 
print (df) 
     foodstuff  type tag 
0 apple-martini cocktail apple 
1  apple-pie dessert apple 
2 lemon-merengue dessert NaN 
3 strawberry-tart dessert NaN 
+0

Nice, спасибо. Вы можете объяснить '' ('+ fruit +') '' – vagabond

+0

Я не эксперт по регулярному выражению, но вам нужны группы захвата, поэтому вам нужно добавить'() 'для' str.extract (' (apple | mango | banana | peach) ' , expand = False) ' – jezrael

+0

Вы также можете проверить [docs] (http://pandas.pydata.org/pandas-docs/stable/text.html#extracting-substrings) – jezrael

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