#python #pandas #class #instance
Вопрос:
Кажется, я не могу понять, что, по моему мнению, должно быть простой операцией для создания экземпляра некоторого произвольного списка (или другого контейнера, который может изменяться со временем) созданного мной класса. Пример воспроизведения:
import pandas as pd df = pd.DataFrame([['helen', 'peanut', 3],['helen', 'butter', 7],['agnes', 'tuna', 5]], columns=['registered_to', 'cat_name', 'sale_price']) cat_owners = df.registered_to.unique() class CatOwner(): def __init__(self, name): self.name=name self.spent_on_cats = df.loc[df.registered_to==name]['sale_price'].sum() for owner in cat_owners: owner = CatOwner(owner) # I know this doesn't work.
cat_owners = [CatOwner(name) for name in cat_owners] #this gets me close
(спасибо за предложение @Tim Roberts), но еще не пришло. helen.spent_on_cats #желаемый результат = 10, вместо ошибки cat_owners.helen.spent_on_cats #если бы мне пришлось сделать это таким образом, это было бы прекрасно, но это также не работает (предпочтительный первый способ), ошибка
Спасибо за помощь!
Ответ №1:
Понимание списка, показанное в вашем вопросе, даст вам список (очевидно) ссылок на объекты CatOwner.
Вы действительно путаете вещи, присваивая понимание переменной, используемой в понимании.
Возможно, это поможет, так как не совсем ясно, какова ваша конечная цель:
import pandas as pd class CatOwner(): def __init__(self, name, df): self.name = name self.spent_on_cats = df.loc[df.registered_to == name]['sale_price'].sum() df = pd.DataFrame([['helen', 'peanut', 3], ['helen', 'butter', 7], ['agnes', 'tuna', 5]], columns=['registered_to', 'cat_name', 'sale_price']) for catowner in [CatOwner(name, df) for name in df.registered_to.unique()]: print(f'{catowner.name} spent {catowner.spent_on_cats} on cats')
Обратите внимание, как ссылка на ваш фрейм данных передается в качестве аргумента конструктору класса. Хотя df доступен в рамках вашего исходного кода, по мере реструктуризации вашей программы вы можете легко обнаружить, что она внезапно выходит за рамки, и ваша программа сломается. Лучше сделать это таким образом, ИМО
Комментарии:
1. Конечная цель… По правде говоря, я пытаюсь перенести 25-летнюю книгу Excel моей организации в следующее поколение. Один и тот же человек был там все это время. Они готовы учиться, но на них оказывается давление, чтобы подключить значительную сеть различных книг Excel с некоторой помощью SQL. Объекты, которые я пытаюсь создать здесь, находятся в центре всего этого. Они легко могут иметь несколько сотен атрибутов и методов/функций.