如何在isin()中给出数据帧



我想转换一个类似的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对象转换为不需要的listisin()将使用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是一个巨大的对象,那么你必须以不同的方式来处理它。

相关内容

  • 没有找到相关文章

最新更新