我希望转换如下的sql查询
SELECT * FROM df WHERE id IN (SELECT id FROM an_df)变成达斯克的等价物。所以,我正在尝试这样做:
d=df[df['id'].isin(an_df['id'])]但这是棘手的NotImplementedError:将'dask.datframe.core.DataFrame‘传递给’‘isin’
然后,我将这个an_df‘’id‘转换为如下所示
d=df[df['id'].isin(list(an_df['id']))] or d=df[df['id'].isin(an_df['id'].compute())]但这很费时。
我想要一个和达斯克一样快的解决方案。df大约有1亿行。
请帮我一把。谢谢
发布于 2022-03-14 12:22:50
我建议添加一个最小的可重复示例,这将使解决这个特定问题更容易:
https://stackoverflow.com/help/minimal-reproducible-example
您似乎正在将an_df['id'].compute()返回的an_df['id'].compute()对象转换为不需要的list。isin()将以熊猫系列或数据对象为论据。请参阅:
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是一个巨大的对象,那么您必须以不同的方式来处理这个问题。
https://stackoverflow.com/questions/71466128
复制相似问题