Как вы добавляете в список в ячейке панды внутри копии кадра данных без изменения оригинала? - PullRequest
0 голосов
/ 30 апреля 2018

Я в значительной степени смущен понятиями представлений в 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]

1 Ответ

0 голосов
/ 30 апреля 2018

Документация pd.DataFrame.copy состояния

Обратите внимание, что при копировании данных Deep = True фактические объекты Python не будут копироваться рекурсивно, только ссылка на объект. Это отличается от copy.deepcopy в стандартной библиотеке, которая рекурсивно копирует объект.

Вы можете получить истинную копию, используя модуль copy :

import copy
df = pd.DataFrame({'a': [[1, 2]]})
df1 = df.copy(deep=True)
for c in df1:
    df1[c] = [copy.deepcopy(e) for e in df1[c]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...