Извлекать только при наличии только одного совпадающего слова из списка

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

 fruit_type = ['Apple','Banana','Cherries','Dragonfruit']


for row in df['sentence']:
    sentence['fruit_type'] = df['sentence'].str.extract("("   "|".join(fruit_type)  ")", expand=False)
  

Результат приведенного выше кода:

 df
sentence                    | fruit_type
here is an apple            | apple
here is a banana, an apple  | banana
here is an orange, a banana | orange
  

Как мне пересмотреть код, чтобы при наличии более 1 типа фруктов в df['sentence'] , df['fruit_type'] возвращался NaN?

Ответ №1:

Вместо extract вы можете использовать exctractall в сочетании с groupby и apply :

Во-первых, чтобы получить все совпадения:

 df['sentence'].str.extractall("("   "|".join(fruit_type)  ")")
  
         0
match   
0   0   apple
1   0   banana
    1   apple
2   0   banana
  

Обратите внимание, что есть pandas.MultiIndex .

Затем, используя .groupby(level=0)[0].apply(list) , вы получите:

 0            [apple]
1    [banana, apple]
2           [banana]
  

И, наконец, после использования .apply(lambda x: x[0] if len(x) == 1 else np.nan) :

 0     apple
1       NaN
2    banana