#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