我对熊猫的数据帧很陌生,如果有人能通过以下示例简要讨论数据帧的可变性,我将不胜感激:
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 是否返回数据帧的新实例,或者它仍然引用使 DF1 暴露给 DF2 的 DF1?
此外,关于数据帧的可变性,我应该注意的任何其他一点将不胜感激。
这个:
df2 = pd.DataFrame(df1)
构造新的数据帧。 有一个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((
我不同意。执行上述操作仍会返回对原始数据帧的切片部分的引用。因此,如果您对 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='nn')
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='nn')
print('df2',df2,sep='n',end='nn')
输出:
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