如何为 dask.dataframe 指定元数据

Posted

技术标签:

【中文标题】如何为 dask.dataframe 指定元数据【英文标题】:How to specify metadata for dask.dataframe 【发布时间】:2017-01-08 23:25:27 【问题描述】:

文档提供了很好的示例,how metadata can be provided。但是,在为我的数据框选择正确的数据类型时,我仍然不确定。

我可以用meta='x': int 'y': float, 'z': float 代替meta='x': 'i8', 'y': 'f8', 'z': 'f8' 吗? 有人可以提示我列出可能的值,例如“i8”吗?什么 dtypes 存在吗? 如何指定包含任意对象的列?如何指定仅包含一个类的实例的列?

【问题讨论】:

【参考方案1】:

可用的基本数据类型是通过 numpy 提供的。查看documentation 获取列表。

此集合中不包括日期时间格式(例如datetime64),更多信息可在pandas 和numpy 文档中找到。

dask 数据帧的元参数通常需要一个空的 pandas 数据帧来保存列、索引和数据类型的定义。

构造这样一个DataFrame的一种方法是:

import pandas as pd
import numpy as np
meta = pd.DataFrame(columns=['a', 'b', 'c'])
meta.a = meta.a.astype(np.int64)
meta.b = meta.b.astype(np.datetime64)

还有一种方法可以为 pandas 数据框的构造函数提供 dtype,但是,我不确定如何为每个列提供它们。如您所见,不仅可以提供数据类型的“名称”,还可以提供实际的 numpy dtype。

关于您的最后一个问题,您要查找的数据类型是“对象”。例如:

import pandas as pd

class Foo:
    def __init__(self, foo):
        self.bar = foo

df = pd.DataFrame(data=[Foo(1), Foo(2)], columns=['a'], dtype='object')
df.a
# 0    <__main__.Foo object at 0x00000000058AC550>
# 1    <__main__.Foo object at 0x00000000058AC358>

【讨论】:

如何判断返回dataFrame的一列是list,还是dict【参考方案2】:

Dask.dataframe 和 Pandas 都使用 NumPy 数据类型。特别是,您可以将其中的任何内容传递给np.dtype。这包括以下内容:

    NumPy dtype 对象,如np.float64 Python 类型对象,如float NumPy dtype 字符串,如'f8'

这是从 NumPy 文档中获取的更广泛的列表:http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html#specifying-and-constructing-data-types

【讨论】:

如果原始 csv 使用 converters 来获取更丰富的类型,如 list,那么 dask 中的元应该指定 list 还是只指定 object 无论 Pandas 数据类型是什么。在这种情况下,我认为 Pandas 会使用 object dtype,但您可以尝试自己查看。 我尝试使用dask.read_csv 将转换器转换为丰富的对象,并且效果很好。 dtypes 最终成为对象。但我认为丰富的对象也可以在元中使用。但我不确定它是否需要。似乎 meta 只能是 object...

以上是关于如何为 dask.dataframe 指定元数据的主要内容,如果未能解决你的问题,请参考以下文章

笔记如何为被装饰的函数保存元数据

如何为 SAML SP 元数据使用 Tomcat SSL 证书

Jetpack Compose 如何为 LazyColumn 懒惰地获取音乐文件及其元数据

python数据结构-如何为元组中的每个元素命名

您如何为 DSpace 创建一个新的、可搜索的元数据模式?

为动态类型指定元类