我想转换一个类似的sql查询
SELECT * FROM df WHERE id IN (SELECT id FROM an_df)
转换为等效的dask。所以,我正在尝试这个:
d=df[df['id'].isin(an_df['id'])]
但它正在处理NotImplementedError:将"dask.datframe.core.DataFrame"传递给"sin">
然后我将这个an_df['id']转换为类似的列表
d=df[df['id'].isin(list(an_df['id']))] or d=df[df['id'].isin(an_df['id'].compute())]
但这非常耗时。
我想要一个和dask一样快的解决方案。df大约有1亿行。
请帮我一下。感谢
我建议添加一个最小的可复制示例,这将使解决这个特定问题变得更容易:
https://stackoverflow.com/help/minimal-reproducible-example
看起来您正在将an_df['id'].compute()
返回的pandas.core.series.Series
对象转换为不需要的list
。isin()
将使用pandas系列或数据帧对象作为参数。请参阅:
https://docs.dask.org/en/latest/generated/dask.dataframe.DataFrame.isin.html
在您的示例中,这应该有效:
series_to_match = an_df['id'].compute()
d=df[df['id'].isin(series_to_match)]
因此可以省略.to_list()
强制转换。我预计这会更快一点,因为这种类型的铸造可以取消。但在这里你仍然需要考虑一些事情。根据an_df['id'].compute()
的大小,您可能会遇到麻烦,因为该语句正在将生成的series
对象拉入您的调度程序正在运行的机器的内存中。
如果这个系列足够小,您可以尝试使用client.scatter
来确保您的所有工作程序都将该系列持久化在内存中,请参阅:
http://distributed.dask.org/en/stable/locality.html
如果series
是一个巨大的对象,那么你必须以不同的方式来处理它。