【问题标题】:Pivot table data structure数据透视表数据结构
【发布时间】:2021-03-24 00:15:52
【问题描述】:

可以使用哪种类型的数据结构(或数据结构?)来存储可以访问数据的二维数据透视表?例如,让我们从 Excel 中复制以下内容:

如果数据都在一维层次结构中——也就是说,它是组 > 产品 > 年份 > 价值,我们可以按照以下方式做一些事情:

{
    "Electronics": {
        "(all)": {
            "Year": {
                "2018": 2,
                "2019": 1,
                "Grand Total": 3
            }
        },
        "Computer": {
            "Year": {
                "2018": 1,
                "2019": 0,
                "Grand Total": 1
            }
        },
        "Phone": {
            "Year": {
                "2018": 1,
                "2019": 1,
                "Grand Total": 2
            }
        }
    }
}
        

然后我可以通过以下方式访问 Electronics > Computer > 2018 的 Value:

obj["Electronics"]['Computer']['Year']
// {2018: 1, 2019: 0, Grand Total: 1}
obj["Electronics"]['Computer']['Year'][2018]
// 1

但我想不出如何将它放入二维多维数组之外的二维数据结构中,除了能够在某个特定位置检索值之外,它实际上没有任何用途位置(我需要存储大量元数据才能知道存储在哪个位置)。

什么是合适的数据结构?我已经标记了 Java、C、C++——任何语言都可以,我对实际的数据结构更感兴趣。

【问题讨论】:

  • 这个问题实在是太开放了,不适合 Stack Overflow。也就是说,“数据透视表”实际上是对普通旧数据集进行分组和聚合的特定配置。您应该分别关注三个部分:数据库本身(实际的数据库或只是内存中的表,或其他),产生所需聚合结果的查询,最后是这些聚合结果的可视化表示.
  • 人们会在这里堆积答案,因为赏金。但我怀疑任何对你真的有帮助。我建议再次阅读How to Ask。我意识到你有足够的声誉,你必须对提出一个好问题(直接或间接)有一些洞察力,但为了不浪费赏金,让它更容易回答可能是一个明智之举。所以请原谅我再次提及它。
  • 我得到的印象是图片中的第一行有冗余数据,可以从其余数据中确定。或者这就是你问题的重点?请考虑定义您对“数据透视表”的理解,也许可以参考您所学的上下文;例如“MS Excel”。
  • @Yunnosch 肯定会添加一些细节。
  • 如果数据采用您显示的输入格式(看起来像 JSON),请考虑提供一个minimal reproducible example,说明您如何读取、存储并按原样输出。这将显示数据结构、输入/输出机制和输出格式。在那个“输出机制”中,也可以是类似于要填充的数据结构,对于给定的样本输入具有期望的结果。 IE。你有所需程序的前三分之一和第三个三分之一。填写缺少的第二个三分之一作为答案会更容易,并且可能对您更有帮助。为此,您可能需要决定一种语言。

标签: java c++ c data-structures pivot-table


【解决方案1】:

在python中分层索引用于实现数据透视表。例如,在 python 中,pandas 数据透视表是多索引数据框。数据帧的实现在https://github.com/pandas-dev/pandas/blob/v0.22.0/pandas/core/frame.py#L236-L6142MultiIndexpandas.core.indexes.multi.py中实现

(https://github.com/pandas-dev/pandas/blob/8dbb593d0c94107ec8b91a4723c40af537807ca4/pandas/core/indexes/multi.py#L179)

对于 C++ 和 Java,还有分层索引库,即 boost::multi_index,这里在 stackoverflow 中 multi-index 有自己的标签。

也许检查boost::multi_index 示例:https://www.boost.org/doc/libs/1_62_0/libs/multi_index/doc/examples.html

Java 中的多索引:Is there an equivalent of boost::multi_index for Java someplace?

https://www.scss.tcd.ie/Owen.Conlan/4d2/4D2-9&10_Multi-Level_Indexes_v1.02.pdfhttps://www.cs.uct.ac.za/mit_notes/database/htmls/chp11.html#multilevel-indexeshttp://theteacher.info/index.php/architecture-data-comms-and-applications-unit-5/4-organisation-and-structure-of-data/all-topics/3940-multi-level-indexes中分析了文件中的多索引(文件系统结构)和搜索算法

python中用于处理多级索引的命令是stackunstack

https://nikgrozev.com/2015/07/01/reshaping-in-pandas-pivot-pivot-table-stack-and-unstack-explained-with-pictures/, https://www.xplenty.com/glossary/what-is-hierarchical-indexing/

【讨论】:

    【解决方案2】:

    我会以表格形式存储数据,即:

    +---------------------------------------+
    | Sector      | Device   | Year | Count |
    +---------------------------------------+
    | Electronics | Computer | 2018 |     1 |
    | Electronics | Phone    | 2018 |     1 |
    | Electronics | Phone    | 2019 |     1 |
    +---------------------------------------+
    

    数据透视表只是呈现上述数据的一种直观方式。

    您可以使用columnar table 表示(即按列而不是按行存储数据)来优化表示以实现快速查询。通常,您会先按最常用的列对列进行排序,对每列的数据进行排序并存储位置以标记每组不同值在列中的开始位置。

    列表示包括用于内存数据的Apache Arrow 和用于存储在磁盘上的数据的Apache Parquet

    对于上述数据,它可能类似于以下内容:

    +-------------+
    | Electronics |
    | Electronics |
    | Electronics |
    +-------------+
    | Computer    |
    | Phone       |
    | Phone       |
    +-------------+
    | 2018        |
    | 2018        |
    | 2019        |
    +-------------+
    | 1           |
    | 1           |
    | 1           |
    +-------------+
    

    【讨论】:

    • 当然,但您还需要所有小计,对吧? (如果您无法对子记录求和,那么诸如独特计数之类的呢?)
    • 可以通过查询数据并存储结果来计算小计。如果多维数据集中的值是非静态的,那么您当然需要完全不同的数据结构——可能是依赖有向图。因此我的问题是,“你想用这些数据做什么?”。除非您事先提供此信息,否则无法回答您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多