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

使用for循环拼接Pandas DataFrame未生效,原对象未更新问题咨询

为啥循环里拼接没修改原DataFrame?看这篇就懂

这问题我之前写代码时也踩过坑,本质是Python变量赋值的底层逻辑在作祟,咱们拆解来看:

问题根源

你写的for df in [A, B]:里,df只是个临时“替身”变量:

  • 第一轮循环时,df暂时指向A对应的DataFrame对象;第二轮指向B的对象。
  • 但当你执行df = pd.concat([df, C], axis=1)时,你并没有修改A或B原本指向的那个DataFrame,而是把df这个变量重新绑定到了pd.concat生成的全新DataFrame上。
  • 原来的A和B自始至终都没动过,还是指向最初没拼接的那个对象,所以循环结束后它们的列当然没变。

两种可行的解决方案

方案1:用列表索引更新引用

把A、B放进列表,通过索引修改列表里的元素,最后再重新赋值给A、B:

import pandas as pd

data = [['Alex',10],['Bob',12],['Clarke',13]]
A = pd.DataFrame(data, columns=['Name','Age'])
B = pd.DataFrame(data, columns=['Name','Age'])
C = pd.DataFrame(data, columns=['Name','Age'])

# 将A、B存入列表
df_list = [A, B]
for idx in range(len(df_list)):
    # 直接修改列表对应位置的元素,替换为拼接后的新对象
    df_list[idx] = pd.concat([df_list[idx], C], axis=1)

# 把更新后的对象重新赋值给A和B
A, B = df_list

print(A.columns)  # 输出: Index(['Name', 'Age', 'Name', 'Age'], dtype='object')
print(B.columns)  # 输出: Index(['Name', 'Age', 'Name', 'Age'], dtype='object')

方案2:用字典管理(更适合多DataFrame场景)

如果后续要处理的DataFrame数量多,用字典来管理会更清晰,避免索引操作的混乱:

import pandas as pd

data = [['Alex',10],['Bob',12],['Clarke',13]]
# 用字典存储需要处理的DataFrame
df_dict = {
    'A': pd.DataFrame(data, columns=['Name','Age']),
    'B': pd.DataFrame(data, columns=['Name','Age'])
}
C = pd.DataFrame(data, columns=['Name','Age'])

# 遍历字典的键,更新对应的值
for key in df_dict:
    df_dict[key] = pd.concat([df_dict[key], C], axis=1)

# 取出更新后的A和B
A = df_dict['A']
B = df_dict['B']

print(A.columns)  # 输出: Index(['Name', 'Age', 'Name', 'Age'], dtype='object')
print(B.columns)  # 输出: Index(['Name', 'Age', 'Name', 'Age'], dtype='object')

额外提醒

pandas的pd.concat函数不会在原对象上直接修改(它没有inplace参数),所以必须把生成的新DataFrame对象重新赋值给原来的变量,才能让A、B指向更新后的结果。

内容的提问来源于stack exchange,提问作者Anirudh Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:32:55