如何为 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 证书