2015-08-31 2 views
1

Это со ссылкой на мой предыдущий вопрос Singular and plural phrase matching in pandas. Поскольку ожидаемая функциональность не была достигнута из помощи, предоставленной другими, я отправляю ее с подходом, который я придерживался, и тем, чего я действительно должен был достичь.Несколько фраз, соответствующих Python Pandas

Ниже приведены двухфазные наборы данных и код.

ingredients=pd.Series(["vanilla extract","walnut","oat","egg","almond"]) 

df=pd.DataFrame(["1 teaspoons vanilla extract","2 eggs","3 cups chopped walnuts","4 cups rolled oats","1 (10.75 ounce) can Campbell's Condensed Cream of Chicken with Herbs Soup","6 ounces smoke-flavored almonds, finely chopped","sdfgsfgsf","fsfgsgsfgfg"]) 

То, что я просто нужно было соответствовать фразы в серии ингредиентов с фразами в DataFrame. В псевдокоде,

Если ингредиенты (единственного или множественного числа), найденный в фразе в DataFrame, вернуть ингредиент. Или иначе, верните false.

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

results=ingredients.apply(lambda x: any(df[0].str.lower().str.contains(x.lower()))) 
df["existence"]=results 
df 

enter image description here

Проблема с моим кодом является то, что он проверяет только количество элементов в серии и перестать искать. В результате я действительно нуждаюсь в следующем:

0           existence 
0 1 teaspoons vanilla extract     vanilla 
1 2 eggs          egg 
2 3 cups chopped walnuts      walnut 
3 4 cups rolled oats       oat 
4 1 (10.75 ounce) can.....      False 
5 6 ounces smoke-flavored almonds.....   almond 
6 sdfgsfgsf         False 
7 fsfgsgsfgfg         False 

Может ли кто-нибудь сказать мне, как мне достичь этой функциональности? Я провел дни, проверяя это, но не везет наконец. Всем спасибо.

+0

* Результат мне действительно нужно следующим образом *, то, что вы получаете сейчас? –

+0

@Thomas The Picture прямо под кодом - это то, что я сейчас получаю. То, что мне нужно, упоминается в конце. –

+0

@ стробижев вы хотите применить функцию следующим образом? Это вызвало у меня ошибку. 'results = components.apply (lambda x: where (df [0] .str.lower(). str.contains (x.lower()), True))' –

ответ

1

Заканчивать numpy string operations:

In [131]: 

df.columns = ['val'] 
V = df.val.str.lower().values.astype(str) 
K = ingredients.values.astype(str) 
df['existence'] = map(''.join, np.where(np.char.count(V, K[...,np.newaxis]),, 
             K[...,np.newaxis], '').T) 
print df 
               val  existence 
0      1 teaspoons vanilla extract vanilla extract 
1            2 eggs    egg 
2        3 cups chopped walnuts   walnut 
3         4 cups rolled oats    oat 
4 1 (10.75 ounce) can Campbell's Condensed Cream...     
5 6 ounces smoke-flavored almonds, finely chopped   almond 
6           sdfgsfgsf     
7          fsfgsgsfgfg  

Есть 2 шага:

In [138]: 
#check if each ingredients in found 
np.char.count(V, K[...,np.newaxis]) 
Out[138]: 
array([[1, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 1, 0, 0, 0, 0, 0], 
     [0, 0, 0, 1, 0, 0, 0, 0], 
     [0, 1, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 1, 0, 0]]) 
In [139]: 
#if it is found, grab its name 
np.where(np.char.count(V, K[...,np.newaxis]), 
         K[...,np.newaxis], '').T 
Out[139]: 
array([['vanilla extract', '', '', '', ''], 
     ['', '', '', 'egg', ''], 
     ['', 'walnut', '', '', ''], 
     ['', '', 'oat', '', ''], 
     ['', '', '', '', ''], 
     ['', '', '', '', 'almond'], 
     ['', '', '', '', ''], 
     ['', '', '', '', '']], 
     dtype='|S15') 
+0

Спасибо вам большое. Это работает, и это, безусловно, лучший код, который я получил. Не могли бы вы рассказать мне, как добавить Nan или любое другое значение по умолчанию в столбец существования, чтобы я мог легко отфильтровать их. Я попробовал df.fillna (0), но это не сработало –

+0

Не удалось: 'df.ix [df.existence == '', 'существование'] = np.nan (или другое значение заполнения)'. Тем не менее, стоит подумать, хотите ли вы иметь 'nan' или' '' 'для отсутствующих значений строк. Так или иначе может возникнуть головная боль по дороге. –

+0

Мне нужно что-то забыть, чтобы я мог легко отфильтровать их. Есть небольшая вещь, с которой я сталкиваюсь с этим кодом, поскольку некоторые множественные фразы не отфильтрованы. Как у меня есть «клубника» в моем списке ингредиентов, но я хочу, чтобы она была напечатана, когда она обнаружила «клубнику» в фразах. Я попрошу об этом в другом вопросе. Еще раз спасибо! –

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