数据包发行问题

时间:2018-12-13 06:24:30

标签: python avro dask

我有键值格式的数据。我创建了一个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文件中有数据。因此,我不能将数据包部分跳过。

1 个答案:

答案 0 :(得分:2)

问题是,发问认为的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的文档字符串。