【问题标题】:Python DataFrame or list for storing objects用于存储对象的 Python DataFrame 或列表
【发布时间】:2017-10-28 09:03:45
【问题描述】:

我可以在 pandas/numpy Series-DataFrame/ndarray 中“存储”类的实例吗 就像我在列表中所做的那样?或者这些库支持内置类型(数字、字符串)。

例如,我有Pointx,y 坐标,我想将Points 存储在Plane 中,这将返回给定坐标的Point

#my class
class MyPoint:

    def __init__(self, x,y):
        self.x = x
        self.y = y

    @property
    def x(self):
        return self.x

    @property
    def y(self):
        return self.y

我在这里创建实例:

first_point = MyClass(1,1)
second_point = MyClass(2,2)

我可以将实例存储在某个列表中

my_list = []
my_list.append(first_point)
my_list.append(second_point)

列表中的问题是它的索引与 x,y 属性不对应。

字典/DataFrame 方法:

Plane = {"x" : [first_point.x, second_point.x], "y" : [first_point.y, second_point.y], "some_reference/id_to_point_instance" = ???}
Plane_pd = pd.DataFrame(Plane)

我读过帖子,在 DataFrame 中使用实例的“id”作为第三列值可能会导致垃圾收集器出现问题。

【问题讨论】:

  • Pandas 是一个第三方数据分析库,其数据帧类主要用于存储原始类型(str、int、float、boolean、datetime 等)数字/指标数据。对于通用对象存储,请使用内置的 Python 类型(例如,列表、字典)。我们只是讨厌您的下一个问题是关于如何从这些对象中提取数据的数据争论。

标签: python pandas numpy


【解决方案1】:

pandas.DataFrame 很乐意存储 python 对象。

一些测试代码来演示...

测试代码:

class MyPoint:
    def __init__(self, x, y):
        self._x = x
        self._y = y

    @property
    def x(self):
        return self._x

    @property
    def y(self):
        return self._y

my_list = [MyPoint(1, 1), MyPoint(2, 2)]
print(my_list)

plane_pd = pd.DataFrame([[p.x, p.y, p] for p in my_list],
                        columns=list('XYO'))
print(plane_pd.dtypes)
print(plane_pd)

结果:

[<__main__.MyPoint object at 0x033D2AF0>, <__main__.MyPoint object at 0x033D2B10>]

X     int64
Y     int64
O    object
dtype: object

   X  Y                                        O
0  1  1  <__main__.MyPoint object at 0x033D2AF0>
1  2  2  <__main__.MyPoint object at 0x033D2B10>

注意事项:

请注意,列表中的两个对象与数据框中的两个对象相同。还要注意O 列的dtype 是object

【讨论】:

  • 这是一个好习惯吗?我的意思是它是否比将对象存储在列表中效率低,或者它并不重要?
  • pandas 的一大优势是查询和分组数据的多种方法。因此,如果您有一个与一行数据相关联的对象,那么是的,将它随身携带可能非常有价值。如果您只想要一个通用的数据结构,那么可能不会……但是 pandas 会很乐意存储数据,从而与连续的其他数据相关联。好或坏是一个对具体情况非常主观的问题。
猜你喜欢
  • 1970-01-01
  • 2015-04-14
  • 2014-07-17
  • 2023-03-31
  • 2021-09-26
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
相关资源
最近更新 更多