You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:42:39