如何将模型对象列表转换为pandas dataframe?

时间:2016-01-25 16:15:00

标签: python numpy pandas

我有这个类的对象数组

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实现这一点,而无需手动处理输入数组?

5 个答案:

答案 0 :(得分:37)

更清晰的方法是在您的课程中定义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,
        }

e.g。

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

答案 1 :(得分:20)

导致所需结果的代码:

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

感谢@Serbitar指出我正确的方向。

答案 2 :(得分:9)

尝试:

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

答案 3 :(得分: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

答案 4 :(得分:3)

我想强调Jim Hunziker的评论。

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

编写起来容易得多,更不容易出错,并且不必在每次添加新属性时都更改to_dict()函数。

如果您想自由选择要保留的属性,可以使用 columns 参数。

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

缺点是它不适用于复杂属性,尽管这种情况很少见。