如何根据条件对DataFrame的一列应用两个不同的函数?
问题解决
错误原因分析
你的代码出现两个核心问题:
- 条件判断错误:在
lambda中使用df['Category'] == 'vegetable'是在判断整个Category列是否等于vegetable,返回的是一个布尔值Series,而非当前行的单个布尔值,这会导致"真值模糊"的报错。 - 函数语法错误:
fruit_pro函数中RegexpTokenizer("[\w+.]+")后面多了一个逗号,导致reg_tokenizer变成了元组而非Tokenizer对象,后续调用tokenize方法会失败。
修正后的代码
第一步:修复函数定义
from nltk.tokenize import RegexpTokenizer def veg_pro(text): reg_tokenizer = RegexpTokenizer('\s+', gaps=True) terms = reg_tokenizer.tokenize(text) return terms def fruit_pro(text): # 移除了多余的逗号 reg_tokenizer = RegexpTokenizer("[\w+.]+") terms = reg_tokenizer.tokenize(text) return terms
第二步:按行应用条件函数
使用df.apply(axis=1)来遍历每一行,同时获取当前行的Produce和Category值:
import pandas as pd # 构造示例DataFrame data = { 'Produce': ['apple is good', 'corn is bad', 'beans is good', 'grape if good'], 'Category': ['fruit', 'vegetable', 'vegetable', 'fruit'] } df = pd.DataFrame(data) # 按条件应用函数 df['processed_produce'] = df.apply( lambda row: veg_pro(row['Produce']) if row['Category'] == 'vegetable' else fruit_pro(row['Produce']), axis=1 )
输出结果
执行后df会新增processed_produce列,内容如下:
| Produce | Category | processed_produce |
|---|---|---|
| apple is good | fruit | ['apple', 'is', 'good'] |
| corn is bad | vegetable | ['corn', 'is', 'bad'] |
| beans is good | vegetable | ['beans', 'is', 'good'] |
| grape if good | fruit | ['grape', 'if', 'good'] |
内容的提问来源于stack exchange,提问作者CPDatascience
相关产品推荐
相关产品推荐

