使用for循环处理多个Pandas DataFrame时修改不生效的原因
问题原因及解决办法
你的循环代码没生效的核心原因:循环中对变量i的赋值只是重新绑定了新的DataFrame对象,完全没修改原来的df1/df2/df3。
当你遍历元组df_names时,i最初指向df1对应的对象,但执行i = i.dropna()后,i就变成了dropna()返回的新DataFrame,和原df1彻底断开了关联。后续的过滤操作都是在这个临时新对象上进行的,原对象根本没被改动,所以最后打印df1/df2/df3还是原来的数据。
解决办法
方法1:收集处理后的结果,重新赋值给原变量
把DataFrame放进列表(元组不可修改),遍历处理后将结果存入新列表,最后把新列表的元素重新赋值给原变量:
import pandas as pd import numpy as np df1 = pd.DataFrame({'depth': [-1, 2, 3, 4, np.nan], 'temp': [-1,2,3,4,5]}) df2 = pd.DataFrame({'depth': [1, 2, 3, 4, 5], 'temp': [-1,2,3,4,5]}) df3 = pd.DataFrame({'depth': [1, 2, 3, 4, 5], 'temp': [-1,2,3,4,np.nan]}) # 用列表存储原始DataFrame df_list = [df1, df2, df3] processed_dfs = [] for df in df_list: # 链式调用简化代码(可选) cleaned_df = df.dropna()\ .query('temp > 0 and depth > 0') processed_dfs.append(cleaned_df) # 重新赋值给原变量 df1, df2, df3 = processed_dfs print(df1, '\n', df2,'\n', df3)
方法2:遍历列表时直接修改元素
用enumerate获取索引,直接替换列表中对应位置的元素:
df_list = [df1, df2, df3] for idx, df in enumerate(df_list): cleaned_df = df.dropna()\ .query('temp > 0 and depth > 0') df_list[idx] = cleaned_df df1, df2, df3 = df_list
注意:不推荐用inplace=True
虽然dropna(inplace=True)可以修改原对象,但这种方式会让代码可读性变差,而且部分pandas方法的inplace返回None,容易引发后续错误。更推荐生成新对象的方式,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

