Как сделать глубокую копию информационного кадра с информационными кадрами в нем? (Python) - PullRequest
0 голосов
/ 17 октября 2019

Я хочу копию кадра данных, который содержит кадр данных. Когда я изменяю что-то во вложенном фрейме данных, он не должен меняться в исходном фрейме данных.

У меня есть фрейм данных, подобный этому:

   0  1                                                  2
0  1  2  <__main__.PossibleCombinations object at 0x000...
1  4  5                                                  6

Генерируется со следующим кодом:

import copy
import numpy as np
import pandas as pd


df = pd.DataFrame(data= [[1,2,3],[4,5,6]])

class PossibleCombinations:
    def __init__(self, dfCombinations, numberCombinations):
        self.dfCombinations = dfCombinations
        self.numberCombinations = numberCombinations

df.iloc[0,2] = PossibleCombinations(pd.DataFrame(data= [[1,2,3],[4,5,6]]),6)
print(df)

Когда я делаю глубокую копию фрейма данных дырки и вложенного фрейма данных и что-то изменяю во вложенном фрейме данных в копии, значение также изменяется в оригинале.

deepCopy = copy.deepcopy(df)
deepCopy.iloc[0,2].dfCombinations = copy.deepcopy(df.iloc[0,2].dfCombinations)

deepCopy.iloc[0,2].dfCombinations.iloc[0,2] = "doei"

print(deepCopy.iloc[0,2].dfCombinations)
print(" ")
print(df.iloc[0,2].dfCombinations)

вывод:

   0  1     2
0  1  2  doei
1  4  5     6

   0  1     2
0  1  2  doei
1  4  5     6

но я хочу:

   0  1     2
0  1  2  doei
1  4  5     6

   0  1     2
0  1  2     3
1  4  5     6

Как решить эту проблему?

1 Ответ

0 голосов
/ 18 октября 2019

Это исправление:

import pickle
deepCopy = pickle.loads(pickle.dumps(df))

deepCopy.iloc[0,2].dfCombinations.iloc[0,2] = "doei"

print(deepCopy.iloc[0,2].dfCombinations)
print(" ")
print(df.iloc[0,2].dfCombinations)

вывод:

3
   0  1     2
0  1  2  doei
1  4  5     6

   0  1  2
0  1  2  3
1  4  5  6

Это решает проблему!

...