2016-07-12 13 views
1

В моем кадре данных есть столбец «a», который может содержать «яблоко» и «оранжевый». Я хочу извлечь их, если они существуют, иначе наклейте «другие».pandas dataframe extract strings

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

result = numpy.where(df['a'].str.contains('apple'), 'apple', 'others') 

Можно ли применить его здесь для случая 3-х категорий? Другими словами, result должен содержать записи «яблоко», «оранжевый» или «другие».

Есть ли лучший способ сделать это, чем просто зацикливание?

ответ

2

Использование str.extract с fillna:

df = pd.DataFrame({'a': ['orange','apple','a']}) 
print (df) 
     a 
0 orange 
1 apple 
2  a 

df['new'] = df.a.str.extract('(orange|apple)', expand=False).fillna('others') 
print (df) 
     a  new 
0 orange orange 
1 apple apple 
2  a others 
+0

Я хочу, чтобы результат будет один из 3-х возможностей: 'яблоко', 'оранжевый' или «о Про ч ее. – nos

+0

Я отредактировал ответ, пожалуйста, проверьте его. – jezrael

3

Просто искать предметы, которые apple или mango с np.in1d для создания булевой маски, которые затем могут быть использованы с np.where, чтобы установить остальные из них, как others. Таким образом, мы имели бы -

df['b'] = np.where(np.in1d(df.a,['apple','orange']),df.a,'others') 

Для случаев, когда вы могли бы искать для работы со строками, которые имеют эти имена как часть больших строк, вы можете использовать str.extract (поймал эту идею из @jezrael's solution, я надеюсь, что все в порядке!), а затем использовать np.where, как так -

strings = df.a.str.extract('(orange|apple)') 
df['b'] = np.where(np.in1d(strings,['apple','orange']),strings,'others') 

Sample пробег -

In [294]: df 
Out[294]: 
      a 
0 apple-shake 
1  orange 
2 apple-juice 
3  apple 
4  mango 
5  orange 
6  banana 

In [295]: strings = df.a.str.extract('(orange|apple)') 

In [296]: df['b'] = np.where(np.in1d(strings,['apple','orange']),strings,'others') 

In [297]: df 
Out[297]: 
      a  b 
0 apple-shake apple 
1  orange orange 
2 apple-juice apple 
3  apple apple 
4  mango others 
5  orange orange 
6  banana others 

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

  • Нет связанных вопросов^_^