熊猫数据帧可变性



我对熊猫的数据帧很陌生,如果有人能通过以下示例简要讨论数据帧的可变性,我将不胜感激:

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

因此,默认情况下,数据将在df2df1之间共享。 如果您不希望共享,而是完整副本,请执行以下操作:

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

最新更新