将函数应用于 df 列中列表中的每个元素

Apply function to every element in a list in a df column

如何将函数应用于数据框每一行中列表中的每个元素?

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

有什么帮助吗?

第一,.

其次,因为您的函数翻译单个单词和 returns 翻译后的单词和检测到的语言作为一个元组,所以要实现您想要的翻译单词列表输出和一个单一检测到的语言。相反,请修改您的函数来执行此操作:

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 has a language detection method。它在 3.0.0 中不起作用,但如果你 pip install googletrans==4.0.0rc1 它会起作用。

另请注意,为了使其正常工作,您必须假设给定列表中的所有单词都是同一种语言。如果这不是您可以做出的假设,则您需要想出其他办法。