使用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
相关产品推荐
相关产品推荐

