Пометьте столбец фрейма данных списком

#python #pandas

#python #панды

Вопрос:

У меня есть столбец фрейма данных text

 text
'a red apple'
'the apple is sweet'
'a yellow banana'
'a green melon'
 

Я хотел бы создать еще один столбец term , сопоставив его со списком ['apple', 'banana, melon']

 for term in the_list:
    df['term'] = bf['text'].apply(lambda x: term if term in x else 'None')
 

Результат, который я получаю

 text                 term  
'a red apple'        None
'the apple is sweet' None
'a yellow banana'    None
'a green melon'      melon
 

Однако я ожидал, что это будет

 text                 term  
'a red apple'        apple
'the apple is sweet' apple
'a yellow banana'    banana
'a green melon'      melon
 

Я чувствую, что это может быть связано с тем, что я использую список, но я не знаю, как создать цикл в самом lambda

Ответ №1:

Использование метода разделения будет работать только в том случае, если строки все время одинаковы. вы должны переключаться между циклом и лямбда-выражением следующим образом

 df = pd.DataFrame(['a red apple',
'a banana yellow ',
'a green melon'], columns=['text'])

the_list = ['apple', 'banana',  'melon']

def fruit_finder(string):
    term_return = 'None'
    for term in the_list:
        if term in string:
            term_return = term
    return term_return

df['term'] = df['text'].apply(fruit_finder)

print(df)
 

вернет соответствующее значение из списка

и приведет к выводу

                text    term
0       a red apple   apple
1  a banana yellow   banana
2     a green melon   melon
 

Редактировать: причина, по которой ваша первоначальная программа не работает, заключается в том, что ваш цикл и лямбда перепутаны. Вы перебираете термины и применяете только этот термин к фрейму данных (т. Е. Ваше последнее выполнение цикла проверяет только термин дыня, поэтому банан и яблоко отображаются как none)

Ответ №2:

Использовать .split

 df['term'] = df['text'].apply(lambda x: x.split()[-1] if x.split()[-1] in myList else None)
 

Комментарии:

1. Отделяет ли «разделение» последнее слово от текста? В реальных данных целевое слово может находиться в любой позиции в тексте. Таким образом, метод не работает. Я отредактирую пример

Ответ №3:

Попробуйте с findall

 df['new'] = df['text'].str.findall('|'.join(l)).str[0]
Out[66]: 
0     apple
1     apple
2    banana
3     melon
Name: text, dtype: object