Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python dask数据帧查询然后示例错误_Python_Parquet_Dask - Fatal编程技术网

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