如何批量将DataFrame指定列的字符串映射为分类值?
批量处理DataFrame多列字符串映射的解决方案
问题背景
现有包含多列的DataFrame,指定列(如A、B、C、D)存储字符串或空值,需通过自定义函数str2cat将每个单元格值映射为分类值(如Yes、No、Unknown)。单列应用该函数可正常运行,但批量对指定多列应用时,出现The truth value of a Series is ambiguous错误,尝试axis=1等方法未解决。
原自定义函数及尝试代码:
# 原自定义函数 def str2cat(s): if not s or s is None or s.strip() == '': return "Some Category" if "some string" in s.str.lower(): return "Another Category" return "Default Category" # 单列处理代码(正常运行) df["A"] = df["A"].astype(str) df["A"] = df["A"].apply(str2cat) # 批量尝试代码(报错) targeted_cols = ["A", "B", "C", "D"] df[targeted_cols] = df[targeted_cols].astype(str) df[targeted_cols] = df[targeted_cols].apply(str2cat)
错误原因
原函数是为单个字符串设计的,但批量调用df[targeted_cols].apply(str2cat)时,函数接收的是Series对象而非单个字符串:
if not s试图判断Series的布尔值,Pandas无法直接确定整个Series的真假,触发歧义错误s.str.lower()是Series的方法,但"some string" in s.str.lower()会判断字符串是否在Series的索引中,而非值里,逻辑完全错误
高效批量处理方案
方案1:用applymap适配原逻辑
applymap会对DataFrame的每个单元格单独调用函数,完全匹配单列apply的逻辑,只需微调函数适配单个字符串输入:
# 修正后的自定义函数 def str2cat(s): # 处理空值、空字符串(astype(str)后None会转为"None",需额外判断) if not s or s.strip() == '' or s == "None": return "Some Category" # 匹配目标字符串(针对单个字符串调用lower()) if "some string" in s.lower(): return "Another Category" return "Default Category" # 批量处理指定列 targeted_cols = ["A", "B", "C", "D"] df[targeted_cols] = df[targeted_cols].astype(str).applymap(str2cat)
方案2:矢量化操作(性能更优)
避免逐单元格循环,用Pandas矢量化方法处理,适合大数据集,性能提升明显:
import numpy as np targeted_cols = ["A", "B", "C", "D"] df[targeted_cols] = df[targeted_cols].astype(str) for col in targeted_cols: # 定义判断条件 conditions = [ # 匹配空字符串或转为字符串的None (df[col].str.strip() == '') | (df[col] == "None"), # 匹配包含目标字符串的情况 df[col].str.lower().str.contains("some string", na=False) ] # 对应分类结果 choices = [ "Some Category", "Another Category" ] # 批量赋值,默认返回Default Category df[col] = np.select(conditions, choices, default="Default Category")
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

