Python函数中DataFrame添加列生效但重命名列失效的原因
为什么Pandas添加列生效但重命名不生效?
问题出在Pandas方法的操作方式差异以及Python变量引用的逻辑上:
添加列是原地修改
df["col3"] = np.nan属于直接对原DataFrame对象进行的原地修改操作——你通过df = dict1["df"]拿到了原DataFrame的引用,修改这个引用指向的对象时,字典里存储的原DataFrame也会跟着变化,所以外部能看到新增的col3。rename默认返回新对象
df.rename(columns={"col1":"new_col1"})默认不会修改原DataFrame,而是创建并返回一个全新的DataFrame对象。你把这个新对象赋值给了局部变量df,但字典里的dict1["df"]仍然指向原来的那个未被重命名的DataFrame,所以外部看不到重命名的效果。
两种解决方法
方法1:使用inplace=True让rename原地修改
修改重命名代码,让操作直接作用于原对象:
import pandas as pd import numpy as np def func(): list1= [ {"item":1, "df":pd.DataFrame(columns=["col1","col2"])}, {"item":2, "df":pd.DataFrame(columns=["col1","col2"])} ] for dict1 in list1: df = dict1["df"] df["col3"] = np.nan df.rename(columns={"col1":"new_col1"}, inplace=True) # 添加inplace=True return list1
方法2:将新对象重新赋值回字典
把rename返回的新DataFrame替换字典里原来的引用:
import pandas as pd import numpy as np def func(): list1= [ {"item":1, "df":pd.DataFrame(columns=["col1","col2"])}, {"item":2, "df":pd.DataFrame(columns=["col1","col2"])} ] for dict1 in list1: df = dict1["df"] df["col3"] = np.nan df = df.rename(columns={"col1":"new_col1"}) dict1["df"] = df # 将新对象赋值回字典 return list1
验证结果
修改后调用函数,输出会变为:
print(func()[0]["df"]) # 输出: Empty DataFrame Columns: [new_col1, col2, col3] Index: []
内容的提问来源于stack exchange,提问作者Somanshu Prasad
相关产品推荐
相关产品推荐

