Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.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_Dask - Fatal编程技术网

Python 对于许多情况,有没有一种好方法可以在dask数据帧上进行条件选择?

Python 对于许多情况,有没有一种好方法可以在dask数据帧上进行条件选择?,python,dask,Python,Dask,我正在从Pandas切换到Dask,希望在数据帧上执行条件选择。我想提供一个条件列表,最好是布尔数组/系列,然后得到一个应用了所有这些条件的数据帧 在Pandas中,我只做了np.all([BoolSeries1,BoolSeries2,…]),并将结果应用到数据帧 将dask.array导入为da 将dask.dataframe作为dd导入 将numpy作为np导入 作为pd进口熊猫 df=pd.DataFrame({'A':np.random.rand(1000),'B':np.random

我正在从Pandas切换到Dask,希望在数据帧上执行条件选择。我想提供一个条件列表,最好是布尔数组/系列,然后得到一个应用了所有这些条件的数据帧

在Pandas中,我只做了np.all([BoolSeries1,BoolSeries2,…]),并将结果应用到数据帧

将dask.array导入为da
将dask.dataframe作为dd导入
将numpy作为np导入
作为pd进口熊猫
df=pd.DataFrame({'A':np.random.rand(1000),'B':np.random.rand(1000),'C':np.random.rand(1000)})
ddf=dd.from_熊猫(df,npartitions=10)
切割=[(ddf['A']>0.4),(ddf['B']<0.4)]
bool_ar=da.all(da.asarray([cut.compute()用于切入切削]),axis=0.compute()
ddf=ddf.loc[bool_ar.to_dask_dataframe()][C']
这可以工作,但速度很慢,因为我必须调用
.compute()
两次


我觉得必须有更好的方法来解决这个问题,首先转换为数组,然后再转换回数据帧,这让人感觉非常笨拙。

您不想过早调用
.compute
。这会将内容从Dask空间带出并返回numpy/pandas,这使得重新对齐内容变得困难,而且效率也很低,相反,我认为您正在寻找
&
操作符

df  = pd.DataFrame({'A' : np.random.rand(1000) , 'B': np.random.rand(1000), 'C' : np.random.rand(1000) })
ddf = dd.from_pandas(df, npartitions=10)

df2 = df[(ddf['A'] > 0.4) & (ddf['B'] < 0.4)]

好吧,我想我已经解决了

import dask.array as da
import dask.dataframe as dd
import numpy as np
import pandas as pd
import operator
from functools import reduce

df  = pd.DataFrame({'A' : np.random.rand(1000) , 'B': np.random.rand(1000), 'C' : np.random.rand(1000) })
ddf = dd.from_pandas(df, npartitions=10)

cuts = [(ddf['A'] > 0.4), (ddf['B'] < 0.4)]

bool_arr = reduce(operator.and_, cuts)
ddf = ddf.loc[bool_arr]['C']
将dask.array导入为da
将dask.dataframe作为dd导入
将numpy作为np导入
作为pd进口熊猫
进口经营者
从functools导入reduce
df=pd.DataFrame({'A':np.random.rand(1000),'B':np.random.rand(1000),'C':np.random.rand(1000)})
ddf=dd.from_熊猫(df,npartitions=10)
切割=[(ddf['A']>0.4),(ddf['B']<0.4)]
bool_arr=减少(运算符和u,切割)
ddf=ddf.loc[bool_arr][C']

使用操作模块中的reduce和and_u解决我的问题。谢谢大家的帮助

您可以使用
.compute()
,并使用在中使用的相同条件pandas@LarissaTeixeira:但是我必须将整个数据帧保存在内存中,对吗?即使在应用了我的选择标准之后,它还是相当大,所以我希望避免这种情况。我在da.all()的末尾添加了一个
.compute()
,但是选择失败,出现了
'cannotindexwithlist from unknown division'
这似乎是未知的部分的问题,我想我应该改变它。一般来说,仍然不能解决解决方案的繁琐问题。使用
.compute()
时,不会将所有数据帧都保存在内存中。我昨天读到了这篇文章,dask数据帧工作起来就像块。你介意制作一个新的吗?对于您的真实案例?您的示例(ddf=ddf[(ddf['A']>0.4)和(ddf['B'])当然,我不知道为什么我没有想到for循环。我想我是在尝试从使用np.all()的numpy复制我的解决方案。谢谢!
import dask.array as da
import dask.dataframe as dd
import numpy as np
import pandas as pd
import operator
from functools import reduce

df  = pd.DataFrame({'A' : np.random.rand(1000) , 'B': np.random.rand(1000), 'C' : np.random.rand(1000) })
ddf = dd.from_pandas(df, npartitions=10)

cuts = [(ddf['A'] > 0.4), (ddf['B'] < 0.4)]

bool_arr = reduce(operator.and_, cuts)
ddf = ddf.loc[bool_arr]['C']