У меня есть класс, который заботится о загрузке данных.
Это создает объект, содержащий фреймы данных, pandas ряд и матрицы в классоподобной структуре:
data.
my_df_object
my_matrix_object
my_series_object
Я передаю data
другому классу (скажем, class_do_stuff
), который должен что-то делать с данными.
import pandas as pd
def __init__(self, data):
self.dynamic_data = copy.deepcopy(data) # create a copy of the data to avoid unwanted
# Need to add a multilayer index to one of the objects for easier handling.
# tried both the following solutions and none work
self.dynamic_data.my_df_object.set_index(['Col1', 'Col2', 'Col3'], inplace = True)
self.dynamic_data.my_df_object = self.dynamic_data.my_df_object.set_index(['Col1', 'Col2', 'Col3'])
К сожалению, ни одна из последних двух строк не работает, так как обе они возвращают фрейм данных, такой как:
In: class_do_stuff.dynamic_data.my_df_object.index
Out: Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7],
dtype='int64', length=8)
In: class_do_stuff.dynamic_data.my_df_object.columns
Out: Index(['Col4', 'Col5'], dtype='object')
Теперь я знаю, что синтаксис правильный, поскольку обе строки работают, если они выходят за пределы инициализации класса.
Итак, вопрос в том, что я делаю что-то не так? Как я могу это исправить?
Пример набора данных:
import numpy as np
import pandas as pd
my_df_object = pd.DataFrame({
'Col1':[1,1,2,3,3,4,8,10],
'Col2':[10,3,5,6,6,3,5,9],
'Col3':[1,2,4,3,5,2,1,6],
'Col4':np.random.randn(8),
'Col5':np.random.randint(1,8,8),
})
Я прочитал этот ответ , но я даже не уверен, относится ли он к моему делу и что Фактическое предлагаемое решение:
ОБНОВЛЕНИЕ
Создание нового объекта работает нормально:
import pandas as pd
def __init__(self, data):
self.dynamic_data = copy.deepcopy(data) # create a copy of the data to avoid unwanted
# Need to add a multilayer index to one of the objects for easier handling.
self.dynamic_data.my_new_df_object = self.dynamic_data.my_df_object.set_index(['Col1', 'Col2', 'Col3'])
Это, конечно, неоптимальное решение, и я до сих пор не могу понять, почему это происходит.
ОБНОВЛЕНИЕ 2
Ни один из двух следующих подходов не работает
import pandas as pd
def __init__(self, data):
self.dynamic_data = copy.deepcopy(data) # create a copy of the data to avoid unwanted
# Need to add a multilayer index to one of the objects for easier handling.
tmp = self.dynamic_data.my_df_object.set_index(['Col1', 'Col2', 'Col3'])
self.dynamic_data.my_df_object = tmp.copy()
del tmp
import pandas as pd
def __init__(self, data):
self.dynamic_data = copy.deepcopy(data) # create a copy of the data to avoid unwanted
# Need to add a multilayer index to one of the objects for easier handling.
tmp = self.dynamic_data.my_df_object.set_index(['Col1', 'Col2', 'Col3'])
del self.dynamic_data.my_df_object
self.dynamic_data.my_df_object = tmp.copy()
del tmp