Jupyter中函数内执行for循环处理pandas数据不生效问题排查
问题原因分析
你的错误核心来源于Python的函数变量作用域规则,以及pandas筛选操作的特性:
- 函数内部的
database属于局部变量:你在函数内执行database = database[xxx]时,本质是给这个局部变量重新绑定了筛选后的新DataFrame对象,并没有修改外部传入的twitter指向的原有对象,函数执行结束后局部变量被回收,外部的twitter自然没有任何变化。 - 函数外直接写可以生效的原因:此时
twitter是当前作用域的变量,赋值操作直接修改了该变量指向的对象,所以后续调用twitter.info()能看到更新后的结果。
修复方案
推荐使用返回值接收的方式,逻辑更清晰也更安全:
def infoClean(liste, database): for i in liste: database = database[~(database['Username'].str.contains(i, case = False, na = False))] # 新增返回处理后的结果 return database # 外部用原变量接收返回值 twitter = infoClean(toRemove, twitter) twitter.info()
如果确实需要原地修改对象,也可以改用drop配合inplace=True实现:
def infoClean(liste, database): # 先收集所有需要删除的行索引 to_drop = [] for i in liste: matched = database['Username'].str.contains(i, case = False, na = False) to_drop.extend(database[matched].index.tolist()) # 原地删除对应行,直接修改传入的对象 database.drop(index=list(set(to_drop)), inplace=True) infoClean(toRemove, twitter) twitter.info()
内容的提问来源于stack exchange,提问作者Jhonny
相关产品推荐
相关产品推荐

