Dataset

Dataset[data]

表示基于列表和关联层次结构的结构化数据集.

更多信息和选项

  • Dataset 不仅可以表示数据的完整矩形多维数组,也可以表示任意的树结构,对应于具有任意层次结构的数据.
  • 根据它所包含的数据,Dataset 对象通常显示为元素的表格或网格.
  • MapSelect 之类的函数可以通过写入 Map[f,dataset], Select[dataset,crit] 等直接应用于 Dataset.
  • Dataset 对象中数据的子集可以通过写入 dataset[[parts]] 获得.
  • Dataset 对象也可以使用专门的查询语法通过写入 dataset[query] 进行查询.
  • 数据集结构
  • 尽管列表和关联的任意嵌套是可能的,二维(表格)形式是最常用的.
  • 下表显示了一个 Dataset 的常见显示形式、它所包含的 Wolfram 语言表达式形式、和它的结构的逻辑诠释之间的对应关系:
  • {{,,},
    {,,},
    {,,},
    {,,}}
    列表的列表
    行和列都没有命名的表格

    {<|"x","y",|>,
    <|"x","y",|>,
    <|"x","y",|> }
    关联的列表
    具有命名列的表格
    <|"a"{,},
    "b"{,},
    "c"{,},
    "d"{,}|>
    列表的关联
    具有命名行的表格
    <|"a"<|"x","y"|>,
    "b"<|"x","y"|>,
    "c"<|"x","y"|>|>
    关联的关联
    具有命名列和命名行的表格
  • Dataset 按行诠释嵌套列表和关联,使得数据的第 1 层(最外层)被诠释为表格的行,第 2 层被诠释为表格的列.
  • 已命名的行和列分别对应第 1 层和第 2 层的关联,其键值是含有名称的字符串. 未命名的行和列对应于这些层上的列表.
  • 数据集的行和列可以通过写入 Transpose[dataset] 互换.
  • 数据集的选项
  • 可给出以下选项:
  • Alignment {Left,Baseline}条目的水平和垂直对齐
    Background None条目的背景色
    DatasetTheme Automatic数据集的整体外观主题
    HeaderAlignment {Left,Baseline}标题的水平和垂直对齐
    HeaderBackground Automatic标题的背景色
    HeaderDisplayFunction Automatic用来格式化标题的函数
    HeaderSize Automatic标题的宽度和高度
    HeaderStyle None标题的样式
    HiddenItems None要隐藏起来的条目
    ItemDisplayFunction Automatic用来格式化条目的函数
    ItemSize Automatic条目的宽度和高度
    ItemStyle None行和列的样式
    MaxItems Automatic最多显示多少个条目
  • 除了 HiddenItemsMaxItemsDatasetTheme,可按以下方式给出选项的设置,分别应用于不同的条目:
  • spec对所有条目应用 spec
    {speck}对相邻层级应用 speck
    {spec1,spec2,, specn,rules}为特定部分指定明确的规则
  • speck 可具有以下形式:
  • {s1,s2,,sn}使用 s1sn,然后使用默认值
    {{c}}所有情况下都使用 c
    {{c1,c2}}交替使用 c1c2
    {{c1,c2,}}循环使用所有 ci
    {s,{c}}先使用 s,然后重复使用 c
    {s1,{c},sn}先使用 s1,然后重复使用 c,最后使用 sn
    {s1,s2,,{c1,c2,},sm,,sn}开始时使用第一个 si 序列,然后循环使用 ci,最后使用后面的 si
    {s1,s2,,{},sm,,sn}开始时使用第一个 si 序列, 最后使用后面的序列
  • 采用形式为 {s1,s2,,{},sm,,sn} 的设置时,如果指定的 si 比数据集中的条目多,将开始的 si 用于前面的条目,将后面的设置用于最后的那些条目.
  • 规则的形式为 ispec,其中 i 指定 Dataset 中的一个位置. 位置也可以是模式.
  • 鼠标悬停在元素上时,可以在数据集的底部读取元素的位置.
  • 可用以下形式给出 MaxItems 的设置:
  • m显示 m 个行
    {m1, m2,,mn}显示数据集层级 imi 条目
  • 对于 MaxItemsAutomatic 表示应显示默认数量的条目.
  • 可用以下形式给出 HiddenItems 的设置:
  • i隐藏位置 i 处的条目
    {i1,i2,,in}隐藏位置 ik 处的条目
    {, iFalse,}显示位置 i 处的条目
    {, iTrue,}隐藏位置 i 处的条目
  • HiddenItems 列表中,新的设置会覆盖以前的设置.
  • ItemDisplayFunctionHeaderDisplayFunction 的个别设置为纯函数,返回要显示的条目. 这些函数接受三个参数:条目的值、条目的位置和包含该条目的数据集.
  • ItemStyleHeaderStyle 的设置的某些位置,明确的规则可被解释为 ispec. 如果要使用样式选项,则将规则与 Directive 封装在一起.
  • 在诸如 AlignmentHeaderAlignmentItemSizeHeaderSize 这样的选项中,也许有列表出现,可能的情况下,将顶层列表解释为单个选项值,否则将其解释为适用于连续 Dataset 层级的值列表.
  • 如果规则的左侧不是列表,则该设置适用于将左侧作为键或索引的任何位置.
  • 可用返回设置的纯函数 f 代替任何设置. 设置由 f[item,position,dataset] 给出.
  • Normal 可用于将任何 Dataset 对象转换为其底层数据,该数据通常是列表和关联关系的组合.
  • 部分运算
  • 语法 dataset[[parts]]Part[dataset,parts] 可用于提取 Dataset 的部分.
  • 可以从 Dataset 提取的部分包括 Part 的所有普通规范.
  • Part 的普通行为不同,如果 Dataset 的指定子部分不存在,则在结果的相应位置生成 Missing["PartAbsent",].
  • 以下部分运算通常用于从表格数据集提取行:
  • dataset[["name"]]提取已命名的行(如适用)
    dataset[[{"name1",}]]提取一组已命名的行
    dataset[[1]]提取第一行
    dataset[[n]]提取第 n
    dataset[[-1]]提取最后一行
    dataset[[m;;n]]提取行 mn
    dataset[[{n1,n2,}]]提取一组已编号的行
  • 以下部分运算通常用于从表格数据集提取列:
  • dataset[[All,"name"]]提取已命名的列(如适用)
    dataset[[All,{"name1",}]]提取一组已命名的列
    dataset[[All,1]]提取第一列
    dataset[[All,n]]提取第 n
    dataset[[All,-1]]提取最后一列
    dataset[[All,m;;n]]提取列 mn
    dataset[[All,{n1,n2,}]]提取列的子集
  • Part 一样,行和列运算可以组合使用. 一些范例包括:
  • dataset[[n,m]]取位于第 n 行和第 m 列的单元
    dataset[[n,"colname"]]提取第 n 行已命名列的值
    dataset[["rowname","colname"]]提取位于已命名行和列的单元
  • 下面的运算可以用来除去来自行和列的标签,实际上相当于将关联变成列表:
  • dataset[[Values]]去除行标记
    dataset[[All,Values]]去除列标记
    dataset[[Values,Values]]去除行和列标记
  • 数据集查询
  • 查询语法 dataset[op1,op2,] 可以被认为是 Part 语法的扩展,以允许应用聚合和变换,以及取数据的子集.
  • 查询的一些常见形式包括:
  • dataset[f]f 应用于整个表格
    dataset[All,f]f 应用于表格的每一行
    dataset[All,All,f]f 应用于表格的每一单元
    dataset[f,n]提取第 n 列,然后对其应用 f
    dataset[f,"name"]提取已命名的列,然后对其应用 f
    dataset[n,f]提取第 n 行,然后对其应用 f
    dataset["name",f]提取已命名的行,然后对其应用 f
    dataset[{nf}]选择性地将 f 映射到第 n
    dataset[All,{nf}]选择性地将 f 映射到第 n
  • 一些更专业的查询形式包括:
  • dataset[Counts,"name"]给出已命名列中不同值的个数
    dataset[Count[value],"name"]给出已命名列中 value 的出现次数
    dataset[CountDistinct,"name"]计算已命名列中不同值的个数
    dataset[MinMax,"name"]给出已命名列中的最小值和最大值
    dataset[Mean,"name"]给出已命名列的平均值
    dataset[Total,"name"]给出已命名列的总值
    dataset[Select[h]]提取满足条件 h 的行
    dataset[Select[h]/*Length]计算满足条件 h 的行的个数
    dataset[Select[h],"name"]选择行,然后从结果中提取已命名的列
    dataset[Select[h]/*f,"name"]选择行,提取已命名列,然后对其应用 f
    dataset[TakeLargestBy["name",n]]给出 n 行,使其已命名的列最大
    dataset[TakeLargest[n],"name"]给出已命名列中的 n 个最大值
  • 降序和升序查询运算符
  • dataset[op1,op2,] 中,查询运算符 opi 按顺序层层深入逐步应用于数据,对于任何给定的运算符,可以按降序应用到数据中,也可以按升序应用到数据中.
  • 组成 Dataset 查询的运算符分为以下几大类,具有不同的升序和降序行为:
  • All,i,i;;j,"key",降序部分运算符
    Select[f],SortBy[f],降序筛选运算符
    Counts,Total,Mean,升序聚集运算符
    Query[],升序子查询运算符
    Function[],f升序任意函数
  • 降序运算符在随后的运算符被应用到更深层之前,应用于原始数据集的相应部分.
  • 降序运算符的一个特征是,它们在一定层上应用时,不改变数据的更深层次的结构. 这保证了随后的运算符将遇到的子表达式,其结构与原始数据集的相应层次是相同的.
  • 最简单的降序运算符是 All,它选取给定层的所有部分,从而使得数据结构在该层保持不变. All 可以安全地被替换为任何其他降序运算符,以得到其它有效查询.
  • 升序运算符在所有随后的运算符应用于更深层次之后被应用. 降序运算符对应于原始数据的层,而升序运算符对应于结果的层.
  • 与降序运算符不同,升序运算符不必保持所运算数据的结构. 运算符一般被认为是升序的,除了被特别认定为降序的情况外.
  • 部分运算符
  • 降序部分运算符指定在任何随后的运算符被应用于更深层次前,在某一层上应该选取哪些元素:
  • All将随后的运算符应用于列表或关联的每个部分
    i;;jij 的部分,并将随后的运算符应用于每个部分
    i仅取部分 i,并将随后的运算符应用于该部分
    "key",Key[key]取关联的 key 值,并对其应用随后的运算符
    Values取关联的值,并对每个值应用随后的运算符
    {part1,part2,}取给定的部分,并对每个部分应用随后的运算符
  • 筛选运算符
  • 降序筛选运算符指定将随后的运算符应用于更深层次前,在某一层上如何重新安排或筛选元素:
  • Select[test]只选取满足 test 的列表或关联的部分
    SelectFirst[test]选取满足 test 的第一个部分
    KeySelect[test]选取键值满足 test 的关联的部分
    TakeLargestBy[f,n],TakeSmallestBy[f,n]选取 n 个元素,其中 f[elem] 以排序顺序为最大或最小
    MaximalBy[crit],MinimalBy[crit]选取使得准则 crit 大于或小于所有其他元素的部分
    SortBy[crit]crit 的顺序对各部分排序
    KeySortBy[crit]根据键值对关联的部分进行排序,按 crit 的顺序
    DeleteDuplicatesBy[crit]选取按照 crit 来看唯一存在的部分
    DeleteMissing丢弃标头为 Missing 的元素
  • 语法 op1/*op2 可用于将两个或多个筛选运算符合并成一个运算符,但仍在一个单一的层运算.
  • 聚集运算符
  • 升序聚集运算符将应用随后运算符于更深层次所得的结果进行合并或汇总:
  • Total结果中总量值的和
    Min,Max给出结果中的最小和最大量值
    Mean,Median,Quantile,给出结果的统计汇总
    Histogram,ListPlot,计算结果中的可视化
    Merge[f]使用函数 f 合并结果中关联的公共键
    Catenate将列表或关联的元素连接
    Counts给出关联,计算结果中值所出现的次数
    CountsBy[crit]给出关联,根据 crit 计算值所出现的次数
    CountDistinct给出结果中不同值的个数
    CountDistinctBy[crit]给出关联,根据 crit 给出结果中不同值的个数
    TakeLargest[n],TakeSmallest[n]取最大或最小的 n 个元素
  • 语法 op1/*op2 可用于将两个或多个聚集运算符合并成一个运算符,但仍在一个单一的层运算.
  • 子查询运算符
  • 升序子查询运算符在将随后的运算符应用于更深层次后执行子查询:
  • Query[]对结果执行子查询
    {op1,op2,}对结果同时应用多个运算符,生成一个列表
    <|key1op1,key2op2,|>对结果同时应用多个运算符,生成具有给定键的关联
    {key1op1,key2op2,}对结果的指定部分应用不同的运算符
  • 当一个或多个降序运算符由一个或多个升序运算符(如 desc/*asc)组成时,降序部分将被应用,然后随后的运算符将应用于更深层次,最后升序部分将在那一层应用于结果.
  • 特殊运算符
  • 特殊降序运算符 GroupBy[spec] 将在它所出现的那一层引入新的关联,并可以从现有的查询中插入或去除,而不影响随后的运算符.
  • 快捷语法
  • 诸如 CountsByGroupByTakeLargestBy 之类的函数通常取另一个函数作为它们的参数. 当与 Dataset 中的关联一起使用时,往往使用这种"by"函数来查找表格中某一列的值.
  • 为此,Dataset 查询允许语法 "string" 在这种语境下表示 Key["string"]. 例如,查询运算符 GroupBy["string"] 在被执行之前自动重写为 GroupBy[Key["string"]].
  • 相似地,表达式 GroupBy[dataset,"string"] 被重写为 GroupBy[dataset,Key["string"]].
  • 查询行为
  • 如果可能的话,类型推断用于确定查询是否成功. 被推断为失败的将导致返回 Failure 对象,而不执行该查询.
  • 在默认情况下,如果在查询过程中有任何信息产生,查询将被中止,并且返回包含该信息的 Failure 对象.
  • 当查询返回结构化数据(例如列表或关联,或这些的嵌套组合)时,其结果将以另一个 Dataset 对象的形式给出. 否则,结果将作为一个普通的 Wolfram 语言表达式给出.
  • 如要了解关于 Dataset 查询特殊行为的更多信息,请参阅 Query 的函数页面.
  • 导入和导出
  • ImportSemanticImport 可用于将文件作为 Dataset 对象从如 "CSV""XLSX" 等格式导入.
  • Dataset 对象可以通过 Export 导出为如 "CSV""XLSX""JSON" 这样的格式.

范例

打开所有单元关闭所有单元

基本范例  (1)

创建一个具有关联列表的简单 Dataset

获取第二行:

获取第二列:

计算每一列的 Total

范围  (1)

从表格数据创建 Dataset 对象:

提取几行数据:

提取指定行:

行仅仅是一个关联:

从指定行选取指定元素:

提取指定列的内容:

在一列内取指定部分:

取行和列的子集:

将函数应用于指定列的内容:

根据列对数据集进行分组,并将运算符应用于各组:

将函数应用于每一行:

将一个函数同时应用于各行和整个结果:

将函数 f 应用于每行的每个元素:

将函数独立应用于各列:

通过指定计算各列的运算符构建一个新的表格:

用同样的方法来重新命名各列:

根据一个准则来选取特定的行:

在选定行后取一个列的元素:

在选定行后取可用列的子集:

取满足准则的第一个行:

从该行中取一个值:

根据一个准则对行排序:

取给出排序函数最大值的行:

根据排序函数给出最上面的 3 行:

删除准则重复的行:

构成一个升序和降序运算符,在筛选行后聚合列值:

通过在查询后应用 Total 得到同一结果:

选项  (42)

Alignment  (2)

右对齐所有的条目:

右对齐 "age" 列:

Background  (10)

将数据集中所有条目的背景设为粉色:

将第一行设为粉色:

将第一列设为粉色:

将一个条目设为粉色:

将前两行的背景分别设为粉色和灰色:

等效的语法:

粉色和灰色的行交替出现:

粉色和灰色的列交替出现,第一列和最后一列为黄色:

粉色和灰色的列交替出现,第三列为黄色:

混合使用不同的颜色:

根据值设置背景色:

根据位置设置背景色:

在设定位置时使用模式:

DatasetTheme  (4)

使用行背景颜色交替出现的主题:

合并主题样式,给出自定义的演示样式:

使用突出显示低层级分组的主题:

采用对长的行和长的列进行条纹化的主题,使其更易于理解:

HeaderAlignment  (2)

右对齐行标题:

中心对齐列标题:

HeaderBackground  (2)

将标题的背景设为粉色:

将行标题的背景设为粉色,将列标题的背景设为青色:

HeaderDisplayFunction  (1)

将标题变为小写:

HeaderSize  (1)

将标题设置为一定的高度(按字符个数计):

设置行标题的宽度,以字符数计:

HeaderStyle  (4)

设置标题的整体样式:

Directive 封装多个样式指令:

使用当前样式表中的样式:

设置特定标题的样式:

HiddenItems  (4)

隐藏一行:

隐藏一列:

隐藏一行,一个条目除外:

隐藏具有给定值的条目:

ItemDisplayFunction  (1)

在所有项的周围加上边框:

用符号替换字符串:

ItemSize  (3)

设置每一项的固定宽度,以字符数计:

设置一个较高的行:

设置一个较窄的列:

ItemStyle  (6)

设置数据集条目的整体样式:

Directive 封装多个样式指令:

使用当前样式表中的样式:

设置特定元素的样式:

根据值设置条目的样式:

根据位置设置条目的样式:

MaxItems  (2)

最多显示几行:

最多显示几行几列:

应用  (3)

表格(关联列表)  (1)

加载泰坦尼克号乘客的数据集:

获取行数:

获取乘客的随机样本:

底层数据是一个关联的列表:

计算年龄不详的乘客的数目:

计算一等舱、二等舱和三等舱的乘客数目:

得到乘客年龄的直方图:

得到乘客年龄的直方图,按照乘客的舱分组:

获取最年长乘客的年龄:

计算总体生存比例:

显示在不同性别和船舱等级时的生存比例:

作为年龄函数,显示生存比例:

编号表格(关联的关联)  (1)

加载行星及其属性的数据集:

查询地球的质量:

得到对应于特定行星的卫星的子表格:

生成行星半径的数据集:

可视化行星的半径:

生成各行星的卫星数目的数据集:

得到行星及其质量的列表,按质量升序排列:

求各行星的卫星的总质量:

得到卫星质量大于月球一半的行星列表:

求各行星的最重的卫星:

得到所有行星的卫星列表:

得到质量与半径的散点图:

计算并制作密度的直方图:

计算各行星的卫星的平均密度:

创建一个表格,将各行星密度与其卫星平均密度进行比较:

分层数据(其他数据的关联的关联)  (1)

加载将国家与行政区划及人口关联的数据集:

底层数据是一个关联,其键是国家,而它们的值是行政区划及人口的进一步关联:

查找指定国家的人口:

给出总人口(该数据集并未包括世界所有国家):

计算每个国家行政区划的个数:

行政区划的总数:

建立行政区划数目的直方图:

通过将每个区划的人口相加,计算各国的总人口数:

得到人口最多的前五个国家:

得到各国人口最多的行政区划:

将一个国家的行政区划数与其人口相关:

传递给 ListLogPlot 的底层数据是列表的关联,每个长度均为 2:

属性和关系  (4)

QueryDataset 所支持的查询语言的运算符形式:

使用 EntityValue 从 Wolfram 知识库获得 Entity 对象的属性的 Dataset

在对数图上绘制沸点和密度:

使用 SemanticImport 将文件导入为 Dataset

计算销售总量:

获得泰坦尼克号上乘客数据集的小样本:

"JSON" 格式导出样本:

如果将具有命名列的数据先转置一下,可以以更紧凑的形式表示:

"CSV" 格式导出样本:

可能存在的问题  (3)

无一致结构的数据通常不能以结构化数据的方式进行格式化:

如果查询的子运算被推断为失败,整个查询将不被执行,并将返回一个 Failure 对象:

默认情况下,如果有任何信息在 Dataset 的运算过程中生成,则将返回一个 Failure 对象:

如要指定不同的行为,使用显式的 Query 表达式,并与选项 FailureAction 结合:

巧妙范例  (2)

通过与真实乘客匹配,计算电影《泰坦尼克号》中主人公 Jack Dawson 和 Rose DeWitt Bukater 生存的可能性:

制作一个互动控件,当一个国家被选定时,画出该国家行政区域的热度图:

Wolfram Research (2014),Dataset,Wolfram 语言函数,https://reference.wolfram.com/language/ref/Dataset.html (更新于 2021 年).

文本

Wolfram Research (2014),Dataset,Wolfram 语言函数,https://reference.wolfram.com/language/ref/Dataset.html (更新于 2021 年).

CMS

Wolfram 语言. 2014. "Dataset." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2021. https://reference.wolfram.com/language/ref/Dataset.html.

APA

Wolfram 语言. (2014). Dataset. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/Dataset.html 年

BibTeX

@misc{reference.wolfram_2024_dataset, author="Wolfram Research", title="{Dataset}", year="2021", howpublished="\url{https://reference.wolfram.com/language/ref/Dataset.html}", note=[Accessed: 19-November-2024 ]}

BibLaTeX

@online{reference.wolfram_2024_dataset, organization={Wolfram Research}, title={Dataset}, year={2021}, url={https://reference.wolfram.com/language/ref/Dataset.html}, note=[Accessed: 19-November-2024 ]}