Я новичок в 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