@seosenior

Идеальный Python Class для Pandas DataFrame?

Мне необходимо создать class без использования библиотек, а только с использованием магических методов, который можно будет импортироваться в pandas.DataFrame, точно так же как обычный словарь (или dataclass).

Пример как импортируется словарь (dict) в dataframe:

import pandas as pd
site_1 = dict(title='Купить телевизор', description='Телевизоры по низкой цене')
site_2 = dict(title='Услуги юриста', description='Адвокат спешит к вам')

df = pd.DataFrame([site_1, site_2])
print(df)


На выходе
| title          | description
-|----------------| ----------------------
0|Купить телевизор| Телевизоры по низкой цене
1|Услуги юриста   |  Адвокат спешит к вам


Пример как импортируется dataclass в dataframe:
from dataclasses import dataclass 
import pandas as pd

@dataclass 
class URL:
    title: str = None
    description: str = None

site_1 = URL(title='Купить телевизор', description='Телевизоры по низкой цене')
site_2 = URL(title='Услуги юриста', description='Адвокат спешит к вам')

df = pd.DataFrame([site_1, site_2])
print(df)


На выходе мы получаем таблицу с именованными столбцами:

На выходе
| title          | description
-|----------------| ----------------------
0|Купить телевизор| Телевизоры по низкой цене
1|Услуги юриста   |  Адвокат спешит к вам


Пример как импортируется обычный класс без методов:

import pandas as pd
class URL_2:

    def __init__(self, title=None, description=None):
        self.title = title
        self.description = description

site_1 = URL_2(title='Купить телевизор', description='Телевизоры по низкой цене')
site_2 = URL_2(title='Услуги юриста', description='Адвокат спешит к вам')
df = pd.DataFrame([site_1, site_2])
print(df)


На выходе мы получаем непонятную таблицу

На выходе
#| 0   
-|---------------
0|<__main__.URL_2 object at 0x7fa4d9622d30>
1|<__main__.URL_2 object at 0x7fa4d84fdf10>
  • Вопрос задан
  • 769 просмотров
Решения вопроса 1
@kamenyuga
Для решения задачи достаточно просто открыть исходный код пандас датафрэйма. Там сначала перебираются вполне определенные типы данных, а затем идут проверки на итерируемость. Любой нормальный учебник по питону описывает, как создавать такие классы самостоятельно. Начать можно с такого кода.
import pandas as pd

class URL_2:

    def __init__(self, title=None, description=None):
        self.title = title
        self.description = description

    def __iter__(self):
        for attr_name in self.__dict__:
            yield getattr(self, attr_name)

if __name__ == '__main__':

    site_1 = URL_2(title='Купить телевизор', description='Телевизоры по низкой цене')
    site_2 = URL_2(title='Услуги юриста', description='Адвокат спешит к вам')

    df = pd.DataFrame([site_1, site_2])
    df.columns = site_1.__dict__
    print(df)

Результат:
title                description
0  Купить телевизор  Телевизоры по низкой цене
1     Услуги юриста       Адвокат спешит к вам
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
LazyTalent
@LazyTalent
Data Engineer, Freelancer
Используй asdict:

from dataclasses import dataclass, asdict
import pandas as pd

@dataclass
class URL:
    title: str = None
    description: str = None

site_1 = URL(title='Купить телевизор', description='Телевизоры по низкой цене')
site_2 = URL(title='Услуги юриста', description='Адвокат спешит к вам')

df = pd.DataFrame([asdict(site_1), asdict(site_2)])
print(df)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы