Использование поля списка в Python Dataclass и заполнение Pandas DF - PullRequest
0 голосов
/ 24 марта 2020

Я новичок в OOP python, и я извлекаю данные из файлов 2 CSV и записываю их в pandas 2 df следующим образом:

input_1 = pd.read_csv("inputters/input_1.csv").set_index("ID")
input_2 = pd.read_csv("inputters/input_2.csv").set_index("ID")

Вот мои занятия :

@dataclass
class Cats:
    v1: str

@dataclass
class Dogs:
    v2: str


@dataclass
class Inputs:
    input_1: object
    input_2: object

    @classmethod
    def from_row(cls, account_id, data) -> object:
        return Inputs(input_1=Cats(v1=data.get('v1')), input_2=Dogs(v2=data.get('v2'))
)

Теперь я хотел бы заполнить python dataclass каждой строкой pandas df, поэтому сделайте что-то вроде этого:

for id, data in full_df.iterrows():
     Inputs.from_row(id, data)

Где full_df является объединенным df из input_1 и input_2, то есть:

full_df = pd.merge(input_1, input_2, on=['ID'], how='left')

Теперь, это все работает, если мы предположим, что для каждого идентификатора будет только 1 запись, то есть не тот случай, когда объединенный df возвращает несколько строк с одинаковым идентификатором

                    v1     v2  
ID                                              
102717.0   1012346501668  2018-08-27 
102717.0   1012346501668  2018-08-27
102728.0   1012346501668  2018-08-27 
... 

Мне нужен способ взять все записи и заполнить один и тот же объект Inputs, чтобы сохранить связь. До сих пор я пытался просто установить input_1 в список, а затем обработать это в pandas, то есть:

@dataclass
class Inputs:
    input_1: List[Cats]
    input_2: object


    @classmethod
    def from_row(cls, id, data) -> object:
        return Inputs(input_1=List[Cats(v1=data.get('v1')], input_2=Dogs(v2=data.get('v2'))

И таким образом я мог бы сделать что-то в pandas, которое заполняет все записи тот же идентификатор и записывает его в список: Inputs.input_1[<Cats>]

Надеюсь, я это четко объяснил.

РЕДАКТИРОВАТЬ

Итак, я думаю, мне нужно сделать несколько для groupby, а затем l oop для групп, чтобы получить доступ к каждому повторному запись ...

full_df = pd.merge(input_1, input_2, on=['ID'], how='left')
a = full_df.head().groupby("ID")
for name, group in a:
    print(group)

Все еще нужна помощь в заполнении списка ...

EDIT2

def testing():
    for name, group in df.groupby("ID"):
        yield [(Cats(v1=data.get('v1')) for index, data in group.iterrows()]

for i in testing():
    print(i)

Это вроде работает, но все еще не уверен, как заставить это выполнить в том же экземпляре как Inputs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...