簡體   English   中英

dask dataframe apply meta

[英]dask dataframe apply meta

我想在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()

同樣的,如果我嘗試具有dtypeint而不是"int"或與此有關的'f8'np.float64所以它似乎並不像它的dtype是造成問題的原因。

關於meta的文檔似乎暗示我應該正在做我正在嘗試做的事情( http://dask.pydata.org/en/latest/dataframe-design.html#metadata )。

什么是meta 我該如何定義呢?

使用python 3.6 dask 0.14.3pandas 0.20.2

meta是計算輸出的名稱/類型的處方。 這是必需的,因為apply()足夠靈活,可以從數據幀中生成任何內容。 正如你所看到的,如果你沒有提供meta ,那么dask實際上會計算部分數據,看看應該是什么類型 - 這很好,但你應該知道它正在發生。 通過提供輸出的零行版本(數據幀或系列)或僅僅類型,您可以避免這種預先計算(這可能很昂貴)並且在您知道輸出應該是什么樣子時更加明確。

計算的輸出實際上是一個系列,所以以下是最簡單的工作

(dask_df.groupby('Column B')
     .apply(len, meta=('int'))).compute()

但更准確的是

(dask_df.groupby('Column B')
     .apply(len, meta=pd.Series(dtype='int', name='Column B')))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM