【发布时间】:2017-11-10 00:00:35
【问题描述】:
我想对 dask 数据帧的单列进行频率计数。该代码有效,但我收到 warning 抱怨 meta 未定义。如果我尝试定义meta,则会收到错误AttributeError: 'DataFrame' object has no attribute 'name'。对于这个特定的用例,我似乎不需要定义meta,但我想知道如何做以供将来参考。
虚拟数据框和列频率
import pandas as pd
from dask import dataframe as dd
df = pd.DataFrame([['Sam', 'Alex', 'David', 'Sarah', 'Alice', 'Sam', 'Anna'],
['Sam', 'David', 'David', 'Alice', 'Sam', 'Alice', 'Sam'],
[12, 10, 15, 23, 18, 20, 26]],
index=['Column A', 'Column B', 'Column C']).T
dask_df = dd.from_pandas(df)
In [39]: dask_df.head()
Out[39]:
Column A Column B Column C
0 Sam Sam 12
1 Alex David 10
2 David David 15
3 Sarah Alice 23
4 Alice Sam 18
(dask_df.groupby('Column B')
.apply(lambda group: len(group))
).compute()
UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.
Before: .apply(func)
After: .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result
or: .apply(func, meta=('x', 'f8')) for series result
warnings.warn(msg)
Out[60]:
Column B
Alice 2
David 2
Sam 3
dtype: int64
尝试定义meta 会产生AttributeError
(dask_df.groupby('Column B')
.apply(lambda d: len(d), meta={'Column B': 'int'})).compute()
这个也一样
(dask_df.groupby('Column B')
.apply(lambda d: len(d), meta=pd.DataFrame({'Column B': 'int'}))).compute()
如果我尝试将dtype 设置为int 而不是"int" 或者就此而言'f8' 或np.float64 则相同,所以看起来不是dtype 导致了问题。
meta 上的文档似乎暗示我应该做我想做的事 (http://dask.pydata.org/en/latest/dataframe-design.html#metadata)。
meta 是什么?我应该如何定义它?
使用python 3.6 dask 0.14.3 和pandas 0.20.2
【问题讨论】:
-
嗯,不知道为什么会失败。这工作
meta=('Column B', 'int')吗? -
不回答你的问题,但是
dask_df.groupby('Column B').count().compute()怎么样?这将获取每列中有效值的数量,而不是长度。dask_df['Column B'].value_counts().compute()是更准确的翻译。我认为的错误是因为输出将 B 列作为 index 而不是列名。 -
这两个似乎都做对了,不知道哪一个最有效