pandas set_index в инициализации класса не работает - PullRequest
1 голос
/ 14 апреля 2020

У меня есть класс, который заботится о загрузке данных.

Это создает объект, содержащий фреймы данных, 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
...