Панды DataFrame означают с объектом - PullRequest
0 голосов
/ 02 мая 2018

У меня есть датафрейм с 2 столбцами nbr и тегом. Nbr содержит целое число, а тег содержит объект Tag.

И я хочу получить среднее значение для всего объекта тега (используя атрибут value, и в результате получим новый тег с этим значением).

Для dataframe.add я добавил метод __add__ в класс Tag. Пример:

import pandas as pd

class Tag(object):
    def __init__(self, value):
        self.value = value
    def __add__(self, other):
        return Tag(self.value + other.value)

a = Tag(2)
b = Tag(8)
frame = pd.DataFrame({
    'tag': [a, b],
    'nbr': [3, 6]
})

new_tag = frame.tag.sum()
print new_tag.value  # 10 

Но для frame.tag.mean() я получаю эту ошибку TypeError: Could not convert <__main__.Tag object at 0x7f375ac460d0> to numeric. Панды сначала пытаются преобразовать объект в число с плавающей точкой: float(x), затем, если это не удается, попробуйте это: x = complex(x).

У меня вопрос, как заставить float(tag_object) или complex(tag_object) вернуть атрибут value, добавив метод в мой класс Tag, как я это сделал с __add__?

Заранее спасибо.

1 Ответ

0 голосов
/ 02 мая 2018

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

Вы можете приблизиться, добавив специальный __float__ метод к Tag:

import pandas as pd

class Tag(object):
    def __init__(self, value):
        self.value = value
    def __add__(self, other):
        return Tag(self.value + other.value)
    def __float__(self):
        return float(self.value)

Как только вы это сделаете, вы получите

a = Tag(2)
b = Tag(8)
frame = pd.DataFrame({
    'tag': [a, b],
    'nbr': [3, 6]
})
new_tag = frame.tag.mean()
>>> print(new_tag)
5.0

Обратите внимание, что это не совсем то, что вы хотели (оно не создает Tag со значением 5.0 - Pandas хочет, чтобы результат был числовым).

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