You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DataFrame.apply还是numpy.vectorize对多列批量应用翻译函数?

问题描述

原始DataFrame

import pandas as pd
df = pd.DataFrame(data= {'Product_JP': ['トマトコ- サルサ C225G','マトケチヤツプ','トマトケチヤツプバリユ-','ケチヤツプハ-フ','トマトケチヤツププレミアム'],
                  'Value1': [1,12313,1.123,0.112,0],
                  'Metric1_JP': ['マ-ケットサイズ(販売金額(x1000))','加重販売率(販売金額)','アイテム販売店当り(販売個数)','加重販売率(販売金額)','加重販売率(販売金額)'],
                  'Type_JP': ['サルサソ−ス','ケチャップ','ケチャップ','ケチャップ','ケチャップ'],
                  'SKU': [4582152498325,4582112498325,4500152498325,4582112398325,4582152483125]},
                 )

原始数据输出如下:

Product_JPValue1Metric1_JPType_JPSKU
0トマトコ- サルサ C225G1.000マ-ケットサイズ(販売金額(x1000))サルサソ−ス4582152498325
1マトケチヤツプ12313.000加重販売率(販売金額)ケチャップ4582112498325
2トマトケチヤツプバリユ-1.123アイテム販売店当り(販売個数)ケチャップ4500152498325
3ケチヤツプハ-フ0.112加重販売率(販売金額)ケチャップ4582112398325
4トマトケチヤツププレミアム0.000加重販売率(販売金額)ケチャップ4582152483125

单列翻译实现

使用df.apply()对单列做日译英的代码可正常运行:

from deep_translator import GoogleTranslator
df['Product_EN'] = df['Product_JP'].apply(lambda row: GoogleTranslator(source='ja', target='en').translate(row))

运行后新增Product_EN列的结果:

Product_EN
0Tomatoco-Salsa C225G
1Matthew
2Tomato miser
3Catch
4Tomato miser premium

批量翻译尝试与报错

需求是批量对所有带_JP后缀的列翻译,自动生成对应_EN后缀的列,编写的代码如下:

JP_columns = [column for column in df.columns if '_JP' in column]
EN_columns = [column.replace('_JP', '_EN') for column in JP_columns]

# 第一种尝试:直接对多列apply
df[EN_columns] = df[JP_columns].apply(lambda row:GoogleTranslator(source='ja', target='en').translate(row))

报错:ValueError: "The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."

第二种尝试使用np.vectorize:

df[EN_columns] = np.vectorize(GoogleTranslator(source='ja', target='en').translate(df[JP_columns]))

报错:ValueError: "The truth value of a DataFrame is ambiguous"


核心问题

  1. 调用df.apply()处理多列时哪里出错了,该如何修正?
  2. 该批量处理场景是否更适合使用np.vectorize实现?

问题解答

1. apply报错原因与修正方案

df.apply()默认按列遍历(axis=0),每次传入lambda的是整列的Series对象,而translate()函数只接收字符串类型的输入,函数内部对入参做逻辑判断时,就会触发“Series真值模糊”的报错。
修正方案:使用applymap()方法,它会遍历DataFrame的每一个元素执行指定操作,刚好匹配逐个单元格翻译的需求。同时建议提前实例化翻译对象,避免重复实例化降低效率:

# 提前实例化翻译器,只初始化一次
translator = GoogleTranslator(source='ja', target='en')
# 对所有JP列的每个元素执行翻译
df[EN_columns] = df[JP_columns].applymap(translator.translate)

2. np.vectorize适用性说明

该场景不适合用np.vectorize实现,原因如下:

  • 代码存在语法错误:直接将整个DataFrame传入了translate()方法,而不是将translate函数本身传给np.vectorize,本身就会触发报错。
  • np.vectorize本质是语法糖,底层还是通过循环实现,并没有真正的向量化加速效果,性能和pandas的applymap基本一致,但语法不如pandas原生方法简洁,且处理字符串类型数据时pandas的适配性更好。

内容的提问来源于stack exchange,提问作者bran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:57:05