Как преобразовать список объектов модели в pandas dataframe?

У меня есть массив объектов этого класса

class CancerDataEntity(Model):

    age = columns.Text(primary_key=True)
    gender = columns.Text(primary_key=True)
    cancer = columns.Text(primary_key=True)
    deaths = columns.Integer()
    ...

При печати массив выглядит так:

[CancerDataEntity(age=u'80-85+', gender=u'Female', cancer=u'All cancers (C00-97,B21)', deaths=15306), CancerDataEntity(...

Я хочу преобразовать это в фрейм данных, чтобы я мог играть с ним более подходящим способом для меня - для агрегирования, подсчета, суммирования и аналогичного. Как бы я хотел, чтобы этот кадр данных выглядел, было бы примерно так:

     age     gender     cancer     deaths
0    80-85+  Female     ...        15306
1    ...

Есть ли способ достичь этого с помощью numpy/ pandas легко, без ручной обработки входного массива?

Ответ 1

Код, который приводит к желаемому результату:

variables = arr[0].keys()
df = pd.DataFrame([[getattr(i,j) for j in variables] for i in arr], columns = variables)

Благодаря @Serbitar для указания меня в правильном направлении.

Ответ 2

Более простой способ - определить метод to_dict для вашего класса, а затем использовать pandas.DataFrame.from_records

class Signal(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def to_dict(self):
        return {
            'x': self.x,
            'y': self.y,
        }

например.

In [87]: signals = [Signal(3, 9), Signal(4, 16)]

In [88]: pandas.DataFrame.from_records([s.to_dict() for s in signals])
Out[88]:
   x   y
0  3   9
1  4  16

Ответ 3

попробовать:

variables = list(array[0].keys())
dataframe = pandas.DataFrame([[getattr(i,j) for j in variables] for i in array], columns = variables)

Ответ 4

Вы можете просто сделать,

import pandas as pd

# define some class
class SomeThing:
    def __init__(self, x, y):
        self.x, self.y = x, y

# make an array of the class objects
things = [SomeThing(1,2), SomeThing(3,4), SomeThing(4,5)]

# fill dataframe with one row per object, one attribute per column
df = pd.DataFrame([t.__dict__ for t in things ])

print(df)

Это печатает:

   x  y
0  1  2
1  3  4
2  4  5

Ответ 5

Я хотел бы подчеркнуть комментарий Джима Хунцикера.

pandas.DataFrame([vars(s) for s in signals])

Писать гораздо проще, меньше подвержено ошибкам, и вам не нужно менять функцию to_dict() каждый раз, когда вы добавляете новый атрибут.

Если вы хотите свободно выбирать, какие атрибуты сохранять, можно использовать параметр columns.

pandas.DataFrame([vars(s) for s in signals], columns=['x', 'y'])

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