【问题标题】:Dask bag to Dataframe IssueDask bag 到 Dataframe 问题
【发布时间】:2018-12-13 06:24:29
【问题描述】:

我有键值格式的数据。我创建了一个 dask 包,然后从该包中创建了一个数据框。但是,当我尝试对该数据框进行分组时,它会抛出错误。但是对于相同的数据,当我直接创建 pandas 数据框或 dask 数据框时,它工作正常。

我想我错过了什么。请帮忙!!!

我在下面的代码中重新创建了问题。

import pandas as pd
import dask.dataframe as dd
import dask.bag as db

df = pd.DataFrame({'A': [1, 1, 2, None],  'B': [1, 2, 3, 4]})

df.groupby(df.A).count()  # pandas, working 

ddf = dd.from_pandas(df, 2)
ddf.groupby(ddf.A).count().compute() # dask dataframe, working 

bg = db.from_sequence([{'A': 1,'B':1}, {'A': 1,'B': 2}, {'A': 2,'B':3 }, {'A': None, 'B': 4}])
ddf_2 = bg.to_dataframe()
ddf_2 = ddf_2.fillna(0)
ddf_2.groupby(ddf_2.A).count().compute()  # throws error 

..........
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

注意:在实际场景中,我在 avro 文件中有数据。所以我不能跳过 dask bag 到 dataframe 部分。

【问题讨论】:

    标签: python avro dask


    【解决方案1】:

    问题是 dask 认为 你拥有的 dtype 不是你 实际上 拥有的 dtype。当您 Bag.to_dataframe 未指定输出 dtypes 时,dask 假定第一个分区具有代表性(加载整个数据集以进行检查很昂贵)并从中推断出数据帧 dtypes,从而将 'A' 推断为整数列。

    In [1]: import dask.bag as db
    
    In [2]: bg = db.from_sequence([{'A': 1,'B':1}, {'A': 1,'B': 2}, {'A': 2,'B':3 }, {'A': None, 'B': 4}])
    
    In [3]: ddf = bg.to_dataframe()
    
    In [4]: ddf.dtypes
    Out[4]:
    A    int64
    B    int64
    dtype: object
    

    实际上虽然'A' 稍后有一个缺失值,因此不能是整数列(pandas 整数系列目前没有缺失值表示,您必须使用浮点数)。为了在这里保持稳健,您应该使用 meta 关键字指定预期数据帧的 dtypes:

    In [5]: ddf = bg.to_dataframe(meta={'A': float, 'B': int})  # specify 'A' has missing values and must be float
    
    In [6]: ddf2 = ddf.fillna(0).astype({'A': int})  # fill missing with 0, and convert A back to int
    
    In [7]: ddf2.groupby(ddf2.A).count().compute()
    Out[7]:
       B
    A
    1  2
    2  1
    0  1
    

    更多信息请参见Bag.to_dataframe 的文档字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2018-03-30
      • 2017-10-04
      • 2019-10-30
      • 2018-11-17
      相关资源
      最近更新 更多