使用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_JP | Value1 | Metric1_JP | Type_JP | SKU | |
|---|---|---|---|---|---|
| 0 | トマトコ- サルサ C225G | 1.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 | |
|---|---|
| 0 | Tomatoco-Salsa C225G |
| 1 | Matthew |
| 2 | Tomato miser |
| 3 | Catch |
| 4 | Tomato 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"
核心问题
- 调用
df.apply()处理多列时哪里出错了,该如何修正? - 该批量处理场景是否更适合使用
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
相关产品推荐
相关产品推荐

