我是Pandas Dataframe的新手,如果有人可以通过以下示例简要讨论DataFrame的可变性,我将非常感激:
d1=pd.date_range('1/1/2016',periods=10,freq='w')
col1=['open','high','low','close']
list1=np.random.rand(10,4)
df1=pd.DataFrame(list1,d1,col1)
据我了解,目前df1是对df对象的引用。
如果我将df1或df1切片(例如df1.iloc[2:3,1:2]
)作为新df的输入(例如df2=pd.DataFrame(df1)
),df2是否返回一个新的dataframe实例,或者它仍然指的是使df1暴露给df2的df1?
关于DataFrame的可变性,我应该注意的任何其他观点都将非常感激。
这个:
df2 = pd.DataFrame(df1)
构造一个新的DataFrame。有一个copy
参数,其默认参数为False
。根据文档,它意味着:
> Copy data from inputs. Only affects DataFrame / 2d ndarray input
因此,默认情况下,数据将在df2
和df1
之间共享。如果您希望不存在共享,而是完整副本,请执行以下操作:
df2 = pd.DataFrame(df1, copy=True)
或者更简洁和惯用:
df2 = df1.copy()
如果你这样做:
df2 = df1.iloc[2:3,1:2].copy()
您将再次获得一份独立副本。但是如果你这样做:
df2 = pd.DataFrame(df1.iloc[2:3,1:2])
它可能会共享数据,但如果您打算修改df
,这种风格还不太清楚,所以我建议不要编写这样的代码。相反,如果你不想复制,只需这样说:
df2 = df1.iloc[2:3,1:2]
总结:如果您想要引用现有数据,请不要调用pd.DataFrame()
或任何其他方法。如果您想要一份独立副本,请致电.copy()
。
它可能会共享数据,但如果您打算修改df,这种风格还不太清楚,所以我建议不要编写这样的代码。相反,如果你不想复制,只需这样说:
df2 = df1.iloc[2:3,1:2]
总结:如果您想要引用现有数据,请不要调用> pd.DataFrame()或任何其他方法。如果你想要一个独立的副本,请调用.copy()
我不同意。执行上述操作仍会返回对原始DataFrame的切片部分的引用。因此,如果您对df2进行任何更改,它将反映在df1中。
而应该使用.copy(),
df2 = df1.iloc[2:3,1:2].copy()
好问题,谢谢。在阅读完其他答案后,我最终玩了一会儿。所以我想和你分享一下。
这里有一些游戏代码:
import pandas as pd
import numpy as np
df=pd.DataFrame([[1,2,3],[4,5,6]])
print('start',df,sep='\n',end='\n\n')
def testAddCol(df):
df=pd.DataFrame(df, copy=True) #experiment in this line: df=df.copy(), df=df.iloc[:2,:2], df.iloc[:2,:2].copy(), nothing, ...
df['newCol']=11
df.iloc[0,0]=100
return df
df2=testAddCol(df)
print('df',df,sep='\n',end='\n\n')
print('df2',df2,sep='\n',end='\n\n')
输出:
start
0 1 2
0 1 2 3
1 4 5 6
df
0 1 2
0 1 2 3
1 4 5 6
df2
0 1 2 newCol
0 100 2 3 11
1 4 5 6 11