Pandas函数内iloc与reset_index未执行,批量处理数据集遇阻求助
解决函数中iloc和reset_index操作未生效的问题
嘿,我一眼就看出问题出在哪儿啦!你的函数里的iloc和reset_index操作其实已经生效了,但只在函数内部的临时副本上生效,根本没影响到你传入的原数据集dataset。下面给你拆解原因和解决方案:
问题根源
当你在函数里执行frame=frame.iloc[:,[3,4]]时,这行代码不是修改原来的frame对象,而是创建了一个新的DataFrame副本,并让函数内部的frame变量指向这个新副本。后面的reset_index操作也是在这个新副本上进行的,但函数结束后这个副本就被销毁了,完全没和你传入的原dataset产生关联——而且你最后也没把处理后的副本返回出去,所以原数据集自然纹丝不动。
解决方案一:返回处理后的DataFrame(推荐,更安全)
让函数把处理好的DataFrame返回,调用时重新赋值给原变量,这样就能拿到修改后的结果了:
def func34(frame): # 先在原对象上执行删除操作(inplace=True会直接修改传入的对象) frame.drop(frame[frame[1]=='Banks'].index.values, inplace=True) frame.dropna(subset=[1], inplace=True) # 提取需要的列,生成新的DataFrame processed_frame = frame.iloc[:, [3,4]] # 重置索引 processed_frame.reset_index(drop=True, inplace=True) # 返回处理后的结果 return processed_frame # 调用函数时一定要接收返回值! dataset = func34(dataset)
如果要处理900个数据集,你可以这样循环:
# 假设all_datasets是你的900个数据集列表 processed_datasets = [] for data in all_datasets: # 传副本避免修改原数据(如果需要保留原数据的话) processed_data = func34(data.copy()) processed_datasets.append(processed_data)
解决方案二:直接修改原对象(不推荐,容易踩坑)
如果你确实想直接修改传入的原对象,避免创建新副本,可以用列删除的方式代替iloc的赋值操作:
def func34(frame): frame.drop(frame[frame[1]=='Banks'].index.values, inplace=True) frame.dropna(subset=[1], inplace=True) # 删除不需要的列,只保留3和4列(直接修改原对象) frame.drop(frame.columns.difference([3,4]), axis=1, inplace=True) # 重置索引 frame.reset_index(drop=True, inplace=True) # 调用后原dataset会直接被修改 func34(dataset)
⚠️ 注意:这种方式会直接修改原数据集,如果你的900个数据集需要保留原始版本,千万别用这个方法!
内容的提问来源于stack exchange,提问作者Harsha Ragyari
相关产品推荐
相关产品推荐

