无法对DataFrame列逐行应用isEnglish函数的问题排查
解决DataFrame检查文本是否为英文时的'Series' object has no attribute 'isascii'错误
问题场景
需要给DataFrame新增eng_check列,逐行校验value列的文本是否为英文(存储True/False结果),但多次尝试代码后均触发错误:'Series' object has no attribute 'isascii',错误代码如下:
def isEnglish(s): return s.isascii() ic1 = sqlalchemy.text(f"select * from public.table") res_ic1 = pd.read_sql(ic1, conn) df_ic1 = pd.DataFrame(res_ic1) print(df_ic1) print(df_ic1.columns.tolist()) df_ic1["eng_check"] = "" # 以下为尝试过的错误写法 # df_ic1["eng_check"] = df_ic1["eng_check"].apply(isEnglish(df_ic1["value"])) # df_ic1["eng_check"] = df_ic1.apply(isEnglish(df_ic1["value"])) # df_ic1["eng_check"] = df_ic1.apply(lambda row : isEnglish(["value"])) # df_ic1["eng_check"] = df_ic1["eng_check"].apply(isEnglish("value")) df_ic1 = df_ic1.assign(eng_check=lambda row: isEnglish(row["value"]))
错误原因
isascii()是Python单个字符串的方法,无法直接作用于Pandas的Series对象。你之前的写法均错误地将整个Series(而非逐行的单个字符串)传入函数,导致触发属性不存在的错误。
正确解决方案
方案1:自定义函数+Series.apply
先处理空值避免报错,再对value列逐行应用函数:
import pandas as pd def isEnglish(s): if pd.isna(s): return False return s.isascii() # 直接对value列应用函数生成结果列 df_ic1["eng_check"] = df_ic1["value"].apply(isEnglish)
方案2:lambda表达式简化
无需单独定义函数,用lambda直接处理:
df_ic1["eng_check"] = df_ic1["value"].apply(lambda s: s.isascii() if not pd.isna(s) else False)
方案3:Pandas字符串方法(推荐,更高效)
利用Pandas内置的str.isascii()批量处理,自动处理空值并填充默认结果:
df_ic1["eng_check"] = df_ic1["value"].str.isascii().fillna(False)
错误写法解析
df_ic1["eng_check"].apply(isEnglish(df_ic1["value"])):直接将整个Series传入isEnglish,函数内部调用Series.isascii()导致报错df_ic1.apply(isEnglish(df_ic1["value"])):同样传递整个Series而非逐行元素lambda row : isEnglish(["value"]):传入的是列表["value"],而非行中value列的字符串值assign(eng_check=lambda row: isEnglish(row["value"])):assign的lambda参数是整个DataFrame,若要逐行处理需指定axis=1,正确写法应为df_ic1.assign(eng_check=lambda df: df["value"].apply(isEnglish))
内容的提问来源于stack exchange,提问作者SQL_Rookie_1992
相关产品推荐
相关产品推荐

