Python dask数据帧查询然后示例错误
我试图从Python dask数据帧查询然后示例错误,python,parquet,dask,Python,Parquet,Dask,我试图从read\u parquet中提取DaskDataFrame,然后应用查询过滤器,然后对其进行采样,以将最终数据帧大小限制为小于或等于10000。以下是伪代码: import dask.dataframe as dd df = dd.concat([ dd.read_parquet(path, index='date').query("(col0 < 4) & (date < '20170201')") for path in
read\u parquet
中提取DaskDataFrame
,然后应用查询过滤器,然后对其进行采样,以将最终数据帧大小限制为小于或等于10000。以下是伪代码:
import dask.dataframe as dd
df = dd.concat([ dd.read_parquet(path, index='date').query("(col0 < 4) & (date < '20170201')")
for path in files ],
interleave_partitions=True)
df = df.sample(float(10000) / max(10000, len(df)))
df = df.compute()
如果我不做.query(…)
部分,那么它就可以正常工作。如果在示例之后应用查询,也可以,但是我无法控制最终的DataFrame
大小。我在这里做的有什么不对吗
我正在运行OS X 10.10.5、fastparquet 0.0.5、dask 0.14.1、python 2.7.12。抛出“ValueError:a必须大于0”错误,因为一些熊猫数据帧是空的。此ValueError由pandas.DataFrame.sample
方法引发。因为我们在dask查询之后进行采样,并且并非所有查询子任务都会生成非空的pandas.DataFrame
,所以几乎可以肯定会发生此值错误
正确的修复应该在dask.dataframe
code中:如果df本身为空,则返回df
本身,否则调用df.sample
:
> /opt/anaconda2/lib/python2.7/site-packages/dask/dataframe/methods.py(166)sample()
164 def sample(df, state, frac, replace):
165 rs = np.random.RandomState(state)
--> 166 return df.sample(random_state=rs, frac=frac, replace=replace)
i.e. return df.sample(random_state=rs, frac=frac, replace=replace) \
if len(df) > 0 else df
您的
.query
是否返回空数据帧?通过pd.DataFrame().sample()
,您可以从pandas获得类似的错误,因此我会在执行查询后检查len(df)
。数据很好,len(df)以百万为单位。Tomaugsburger的评论是正确的,尽管长度检查不应该在daskdataframe查询之后,而是在dask.DataFrame.sample(…)函数内部(参见下面的答案),因为更常见的情况是一些分区是空的,但整个dask.dataframe不是空的。
> /opt/anaconda2/lib/python2.7/site-packages/dask/dataframe/methods.py(166)sample()
164 def sample(df, state, frac, replace):
165 rs = np.random.RandomState(state)
--> 166 return df.sample(random_state=rs, frac=frac, replace=replace)
i.e. return df.sample(random_state=rs, frac=frac, replace=replace) \
if len(df) > 0 else df