Я в значительной степени смущен понятиями представлений в pandas и тем, как pandas dataframe ссылается на свое содержимое при копировании. Я уверен, что эксперты здесь могут дать мне несколько прямых ответов. Я очень толстый, когда дело доходит до этой или тупой философии, и я думаю, что эти два связаны.
Вот типичный пример:
import pandas as pd
import datetime
from random import randint
print "done importing modules"
def aRandomRow() :
out={}
out['aDate'] = datetime.datetime(randint(2010,2018),randint(1,12),randint(1,28))
out['aScalar']=randint(1,1000)
out['anArray']=[randint(1,1000),randint(1,1000),randint(1,1000)]
out['anArDate']=[datetime.datetime(randint(2010,2018),randint(1,12),randint(1,28)),datetime.datetime(randint(2010,2018),randint(1,12),randint(1,28)),datetime.datetime(randint(2010,2018),randint(1,12),randint(1,28))]
return out
# Now the dataframes for the examples
df=pd.DataFrame([aRandomRow(),aRandomRow(),aRandomRow()])
df1=df.copy()
df2=df.copy(deep=True)
#I get something like this :
aDate aScalar anArDate anArray
0 2016-07-28 5 [2015-02-06 00:00:00, 2015-12-14 00:00:00, 201... [121, 67, 277]
1 2014-05-04 39 [2015-11-03 00:00:00, 2014-04-23 00:00:00, 201... [939, 105, 714]
2 2010-12-01 157 [2015-07-05 00:00:00, 2012-05-06 00:00:00, 201... [43, 79, 230]
#Now I modify the copies and check the result on the original
df1.loc[0,'aDate'] = 1001
df2.loc[0,'aDate'] = 1002
# df1 and df2 get modified but not df. As intuitively intended.
df1.loc[0,'anArray'].append(1001)
df2.loc[0,'anArray'].append(1002)
# the list inside the cell index 0 of df.anArray gets appended with 1001 and 1002
# that is what bugs/puzzle me !
aDate aString anArDate anArray
0 2016-07-28 5 [2015-02-06 00:00:00, 2015-12-14 00:00:00, 201... [121, 67, 277, 1001, 1001, 1002]
1 2014-05-04 39 [2015-11-03 00:00:00, 2014-04-23 00:00:00, 201... [939, 105, 714]
2 2010-12-01 157 [2015-07-05 00:00:00, 2012-05-06 00:00:00, 201... [43, 79, 230]