Применить функцию к каждому элементу в списке в столбце df

Как применить функцию к каждому элементу списка в каждой строке фрейма данных?

ДФ:

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 17.05.2022 18:12

Я предоставил. Пожалуйста, проверьте правильно. @ddejohn

Jazz 17.05.2022 18:14

Пожалуйста, прочитайте связанную статью. Данные вашего примера нельзя копировать и вставлять. См. также, как предоставить образец набора данных.

ddejohn 17.05.2022 18:16
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
3
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вы никогда не должны использовать голый 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 разных столбцах, при этом я получаю кортежи в списке.

Jazz 17.05.2022 18:12

Проблема здесь в том, что ваша функция не предназначена для обеспечения желаемого результата. Ваша функция принимает по одному слову и возвращает кортеж (translated_word, original_language), для каждого слова. Вам нужно будет потратить некоторое время на размышления о том, как это сделать, поскольку это не так просто, как перевести все слова, а затем вернуть list_of_translated_words, original_language, поскольку возможно, что вы получите список слов из нескольких языков (например, ["pompelmo", "pamplemousse"] - - возвращать было бы неправильно ["grapefruit", "grapefruit"], IT).

ddejohn 17.05.2022 18:24

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

ddejohn 17.05.2022 18:47

теперь отлично работает! :) Спасибо, я действительно хотел использовать одну и ту же функцию как для списков, так и для строк, но я использовал вашу реализацию и обработал ее с помощью некоторого if-else, чтобы проверить тип ввода и получить свою окончательную функцию! :)

Jazz 17.05.2022 21:47

Другие вопросы по теме