[英]Apply function to every element in a list in a df column
如何将 function 应用于 dataframe 每一行中列表中的每个元素?
df:
label top_topics
adverts ['werbung', 'geschenke']
我的 function 看起来像这样:
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
期待 output,例如:
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
有什么帮助吗?
首先, 你永远不应该使用裸except
。
其次,因为您的 function 翻译了一个单词并将翻译后的单词和检测到的语言作为一个元组返回,所以要实现您想要的 output 翻译单词列表和一种检测到的语言将是困难而乏味的。 相反,请修改您的 function 以执行此操作:
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
它会。
另请注意,为了使其起作用,您必须假设给定列表中的所有单词都是相同的语言。 如果这不是您可以做出的假设,则您需要想出其他办法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.