如何用for循环优化重复的Pandas DataFrame处理代码?
问题解决:循环中更新Pandas DataFrame无效的问题
问题原因
你循环里的df = pd.merge(...)是重新赋值了一个新的DataFrame对象,但列表里存储的只是原空DataFrame的引用,修改后的新对象并没有替换列表里的旧引用,所以原变量first、second等不会被更新。
解决方案1:直接生成并存储处理后的DataFrame
不需要提前创建5个空DataFrame,直接在循环里生成每个处理好的DataFrame并存入列表,最后按需分配变量:
list_df = [] for i in range(1, 6): col_name = f"{i}PLetra" # 初始化单个DataFrame并赋值列 df = pd.DataFrame() df[col_name] = letras df = pd.merge(df, posicao[[col_name, f"{i}P"]], on=col_name, how='left') df = df.fillna(0) # 将处理好的DataFrame加入列表 list_df.append(df) # 把列表中的元素分配给原变量 first, second, third, fourth, fifth = list_df
解决方案2:用字典管理更直观
如果想保留原变量名的语义,用字典存储会更清晰,方便后续按名称取用:
df_dict = {} # 对应序号的变量名列表 names = ['first', 'second', 'third', 'fourth', 'fifth'] for i, name in enumerate(names, start=1): col_name = f"{i}PLetra" df = pd.DataFrame() df[col_name] = letras df = pd.merge(df, posicao[[col_name, f"{i}P"]], on=col_name, how='left') df = df.fillna(0) df_dict[name] = df # 按名称取出使用 first = df_dict['first'] second = df_dict['second'] # ... 其他变量以此类推
原循环失效的核心原因
原代码中list_df = [first, second, third, fourth, fiveth]存储的是5个空DataFrame的引用,循环里df = pd.merge(...)让df指向了新创建的对象,但列表里的原引用并没有被替换,所以循环结束后first等变量还是最初的空DataFrame。
内容的提问来源于stack exchange,提问作者Lucas Leonardo Ciaramella Reis
相关产品推荐
相关产品推荐

