为何Pandas DataFrame函数可新增列却无法实现行子集化?
问题原因解析
这是因为Python可变对象的引用传递规则与pandas的操作特性共同导致的:
添加新列是原地修改原对象
函数里的a_dataframe一开始是原frame的引用,执行a_dataframe["new_col"] = "new_value"时,属于对可变对象(DataFrame)的原地修改操作,直接改变了原frame的内容,所以外部的frame能看到新增的列。截取前10行是创建新对象,未改变原引用
a_dataframe.iloc[0:10,:]会生成一个原DataFrame的子集新对象,而a_dataframe = ...只是把函数内部的局部变量重新指向了这个新对象,并没有修改外部frame原本指向的原对象,所以外部的frame仍保留100行。
如果要实现既添加列又让原对象变为前10行,有两种常用方式:
方式一:函数返回新对象,外部重新赋值
def test(a_dataframe): a_dataframe["new_col"] = "new_value" return a_dataframe.iloc[0:10,:] frame = test(frame)
方式二:原地删除多余行(不推荐处理大数据集)
def test(a_dataframe): a_dataframe["new_col"] = "new_value" # 原地删除第10行及之后的所有行 a_dataframe.drop(a_dataframe.index[10:], inplace=True)
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

