Как применить функцию к каждому элементу списка в каждой строке фрейма данных?
ДФ:
label top_topics
adverts ['werbung', 'geschenke']
моя функция выглядит примерно так:
from langdetect import detect
from googletrans import Translator
def detect_and_translate(text):
target_lang = 'en'
try:
result_lang = detect(text)
except:
result_lang = target_lang
if result_lang == target_lang:
return text, result_lang
else:
translator = Translator()
translated_text = translator.translate(text, dest=target_lang)
return translated_text.text, result_lang
ожидая вывода, например:
label top_topics translation language
adverts ['werbung', 'geschenke'] ['advertising', 'gifts'] de
Я пробовал что-то подобное, но не переводил столбец top_topics
, так как он не мог перебрать каждый элемент в списке.
df['translate_detect'] = df['top_topics'].apply(detect_and_translate)
df['top_topics_en'], df['language'] = df.translate_detect.str
Любая помощь?
Я предоставил. Пожалуйста, проверьте правильно. @ddejohn
Пожалуйста, прочитайте связанную статью. Данные вашего примера нельзя копировать и вставлять. См. также, как предоставить образец набора данных.
Во-первых, вы никогда не должны использовать голый except
.
Во-вторых, поскольку ваша функция переводит одно слово и возвращает переведенное слово и обнаруженный язык в виде кортежа, было бы сложно и утомительно добиться желаемого результата в виде списка переведенных слов и одного обнаруженного языка. Вместо этого измените свою функцию, чтобы сделать это:
import googletrans
def detect_and_translate(lst):
translator = Translator()
target_lang = 'en'
try:
result_lang = translator.detect(lst[0])
except Exception: # should be the specific exception that can occur
return lst, result_lang
translations = []
for text in lst:
translated_text = translator.translate(text, dest=target_lang)
translations.append(translated_text.text)
return translations, result_lang
Использование:
In [4]: googletrans.__version__
Out[4]: '4.0.0-rc.1'
In [5]: df[["topics_en", "language"]] = df.top_topics.apply(detect_and_translate).apply(pd.Series)
In [6]: df
Out[6]:
label top_topics topics_en language
0 adverts [werbung, geschenke] [advertising, gifts] Detected(lang=de, confidence=None)
Обратите внимание, что googletrans.Translator
имеет метод определения языка. Это не работает в 3.0.0
, но если вы pip install googletrans==4.0.0rc1
, то будет.
Обратите также внимание, что для того, чтобы это работало, вы должны предположить, что все слова в заданном списке принадлежат одному и тому же языку. Если это не предположение, которое вы можете сделать, вам нужно придумать что-то еще.
Привет спасибо ! Ваше решение частично работает, так как мне нужен вывод в 2 разных столбцах, при этом я получаю кортежи в списке.
Проблема здесь в том, что ваша функция не предназначена для обеспечения желаемого результата. Ваша функция принимает по одному слову и возвращает кортеж (translated_word, original_language)
, для каждого слова. Вам нужно будет потратить некоторое время на размышления о том, как это сделать, поскольку это не так просто, как перевести все слова, а затем вернуть list_of_translated_words, original_language
, поскольку возможно, что вы получите список слов из нескольких языков (например, ["pompelmo", "pamplemousse"]
- - возвращать было бы неправильно ["grapefruit", "grapefruit"], IT
).
Если вы можете предположить, что все слова в данном списке будут на одном языке, см. мое редактирование.
теперь отлично работает! :) Спасибо, я действительно хотел использовать одну и ту же функцию как для списков, так и для строк, но я использовал вашу реализацию и обработал ее с помощью некоторого if-else, чтобы проверить тип ввода и получить свою окончательную функцию! :)
Укажите минимальный воспроизводимый пример.