Pandas中apply调用自定义函数缺失第二个参数的问题排查
问题分析与解决方法
错误原因
你定义的replace_new函数需要接收city和pos两个参数,但使用df[["City","pos"]].apply(replace_new, axis=1)时,apply会把每一行打包成一个Series对象传给函数,而不是拆分出两个独立参数。函数只收到一个参数,自然会报“缺少pos参数”的错误。
解决方法
方法1:适配行对象修改函数
调整函数逻辑,让它接收整行数据,再从中提取需要的字段:
def replace_new(row): city = row["City"] pos = row["pos"] if pos == 0: return city.replace("[Nn]ew", "New_", regex=True) else: return city # 替换City列,保留其他原有列 df["City"] = df.apply(replace_new, axis=1) # 清理临时的pos列 df.drop("pos", axis=1, inplace=True)
方法2:用lambda拆分参数传递
如果不想修改原函数,可以用lambda把行里的字段拆出来传给函数:
def replace_new(city, pos): if pos == 0: return city.replace("[Nn]ew", "New_", regex=True) else: return city df["City"] = df.apply(lambda row: replace_new(row["City"], row["pos"]), axis=1) df.drop("pos", axis=1, inplace=True)
方法3:更简洁的正则直接替换(推荐)
其实完全不需要创建pos列,直接用正则锚定字符串开头,匹配New或new并替换,一行代码就能完成需求:
df["City"] = df["City"].str.replace(r"^[Nn]ew", "New_", regex=True)
这里的^表示匹配字符串开头,[Nn]匹配大小写的N,精准替换开头的目标字符,效率更高、代码更简洁。
最终效果
执行后原DataFrame的City列会变成:['York New', 'Parague', 'New_Delhi', 'Venice', 'New_Orleans'],完全符合需求。
内容的提问来源于stack exchange,提问作者Proloy Chatterjee
相关产品推荐
相关产品推荐

