如何构建处理紧密交互数据的数据结构

时间:2014-12-23 01:04:37

标签: python data-structures pandas

好吧,我真的不知道如何清楚地命名这类数据。 假设我有一个项目列表,每个项目属于多个类别,例如

item 1 belongs to category A and B
item 2 belongs to category B and C

因此,

category A has item 1, 
category B has item 1 and item 2, 
category C has item 2.

目前我分别构建两个DataFrame(pandas),基于类别和基于项目的DataFrame,如

In[0]: import pandas as pd
In[1]: d = {'category': ['A', 'B', 'C'], 'items': [1, [1,2], 2]}
In[2]: pd.DataFrame(data = d)

Out[2]:

  category   items
0        A       1
1        B  [1, 2]
2        C       2

In[3]: d = {'item': [1,2], 'category': [['A', 'B'], ['B', 'C']]}
In[4]: pd.DataFrame(data = d)

Out[4]: 

  category  item
0   [A, B]     1
1   [B, C]     2

我希望有一个有效的数据结构来呈现数据关系。 只使用一种数据结构而不是两种来呈现这类数据,任何想法?

不过,我的数据集有数百万个项目和数千个类别,效率对于这个数据结构非常重要。

2 个答案:

答案 0 :(得分:0)

一种方法是将列用作“属于”成员虚拟变量,如下所示:

In [109]: pandas.DataFrame(
    [[1, 1, 1, 0], [2, 0, 1, 1]], 
    columns=['itemName', 'belongsToA', 'belongsToB', 'belongsToC']
)

Out[109]: 
   itemName  belongsToA  belongsToB  belongsToC
0         1           1           1           0
1         2           0           1           1

但实际上它完全取决于您计划对数据使用的算法和操作。

答案 1 :(得分:0)

你可能过度思考这个问题了。通常,简单的解决方案就是答案。至少尝试这个简单的解决方案通常是一个好主意,因为如果它确实解决了问题,那么你很快就会完成。如果它不起作用,您已经了解了有关数据性质的更多信息。

您有物品和类别。项目可以属于多个类别,而类别可以包含多个项目。这种天真的方法当然是将所有内容保存在一个数组中并按顺序搜索它。那将工作,但速度会非常慢。

下一个方法是保留两个独立的数据结构:一个用于Items,一个用于Categories。 Items数据结构是由项ID标记的哈希映射。每个项目都包含项目所属类别的类别标识符列表。

“类别”是按类别ID索引的哈希映射。每个Category条目都包含属于该类别的项目列表。

项目列表的内存要求与项目数量乘以项目所属的平均类别数量成正比。但请记住,每个项目中的类别列表只是一个标识符列表。或许也可以参考。因此,如果您有一百万个项目,平均每个项目属于三个类别,那么您需要存储百万个项目以及三百万个参考项目。

类别列表内存要求与类别数乘以每个类别的平均项数成比例。同样,项目引用也很小。

这可能需要比将所有内容保存在单个数据结构中更多的内存,但查找和插入速度很快。删除有点慢,但并不可怕。特别是,对于类别或项目,查找是O(1)。

最坏情况内存要求当然是可怕的(即2 * Items * Columns),但只有当每个项目都属于荒谬的类别时才会发生。

如果您确实需要将其作为单个数据结构,请将两个哈希映射包装到单个数据结构中,您可以按项目或类别进行查询。

如果我在你的位置,我会给上面一个镜头。正如我所说,它很容易实现,可能很好地做你想要的。我不是Python程序员,所以我不能给你一个例子。