Pandas DataFrame - Как установить несколько столбцов из объекта одновременно - PullRequest
0 голосов
/ 18 марта 2020

У меня есть class Features(), который является калькулятором для нескольких функций. Он принимает домен, такой как google.com, и устанавливает различные свойства, такие как tld, sld, sld_length et c. У меня также есть датафрейм с колонкой domain.

class Features():
    def __init__(domain):
        ....
        # split domain and do some calculations
        # set attributes

Мне нужно добавить еще столбцы на основе серии domain. Для этого я хочу использовать класс Features, который вычисляет некоторые свойства из domain (в виде строки).

Для каждой строки в кадре данных я хотел бы создать экземпляр класса только один раз.

Как это сделать?

Прямо сейчас я должен сделать это.

df = pandas.read_csv(MY_CSV_WITH_DOMAINS)

df['sld'] = df['domain'].apply(lambda x: Features(x).sld)
df['sld_length'] = df['domain'].apply(lambda x: Features(x).sld_length)

, который создает экземпляр класса несколько раз, поэтому несколько раз он должен вычислять все свойства.

1 Ответ

0 голосов
/ 18 марта 2020

Вы можете создать словарь с экземплярами Features для каждого уникального domain:

import pandas as pd

df = pd.DataFrame({'domain':[1, 3, 42, 3, 42]})

class Features():
    def __init__(self, domain):
        self.sld = domain**2
        self.sld_length = len(str(self.sld))

F = {d: Features(d) for d in df['domain'].unique()}

df['sld'] = df['domain'].apply(lambda x: F[x].sld)
df['sld_length'] = df['domain'].apply(lambda x: F[x].sld_length)

print(df)

   domain   sld  sld_length
0       1     1           1
1       3     9           1
2      42  1764           4
3       3     9           1
4      42  1764           4

Перечитывая вопрос, я вижу, что все домены могут быть разными, и в этом случае вы делаете не нужно unique() выше.

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