是否可以使用dask获得集合的交集?

时间:2019-05-01 12:02:01

标签: python pandas dask

我有一个大数据集(5000万行),在其中我需要进行一些按行计算,例如获取两组集合的交集(每组都在不同的列中)

例如

col_1:{1587004, 1587005, 1587006, 1587007}
col_2:{1587004, 1587005}
col_1.intersection(col_2) = {1587004, 1587005}

这对于我的虚拟数据集(100 000)行工作正常。 但是,当我尝试与实际的相同时,内存将耗尽

我的编码使用熊猫 1:1将其移植到dask不起作用 NotImplementedError:系列getitem仅支持具有匹配分区结构的其他系列对象

到目前为止,玩map_partitions无效

工作代码:

df["intersection"] = [col_1.intersection(col_2) for col_1,col2 in zip(df.col_1,df.col_2)]

用dask df替换pandas df会在未实现的错误中运行:

ddf["intersection"] = [col_1.intersection(col_2) for col_1,col2 in zip(df.col_1,df.col_2)]

使用map_partions“有效”,但我不知道如何将结果分配给现有的ddf

def intersect_sets(df, col_1, col_2):
    result = df[col_1].intersection(df[col_2])
    return result

newCol = ddf.map_partitions(lambda df : df.apply(lambda series: intersect_sets(series,"col_1","col_2"),axis=1),meta=str).compute()

只是做:

ddf['result'] = newCol

通往: ValueError:并非所有分区都是已知的,无法对齐分区。请使用set_index设置索引。

更新: 重置索引可消除错误,但是包含交点的列不再与其他两列匹配。看来订单搞砸了...

ddf2 = ddf.reset_index().set_index('index')
ddf2 ['result'] = result

我希望包含以下各列的数据框很简单

col_1:{1587004, 1587005, 1587006, 1587007}
col_2:{1587004, 1587005}
col_3:{1587004, 1587005}

不仅赞赏一个完美的解决方案,而且对map_partitions的工作原理的一些见解也将对我有很大帮助:)

1 个答案:

答案 0 :(得分:0)

如果您有适用于熊猫数据框的函数:

def f(df: pandas.DataFrame) -> pandas.Series:
    return df.apply(...)

然后您可以在分区上映射此功能

df['new'] = df.map_partitions(f)

我认为您的问题是您在这里不必要地调用了计算,因此您正在尝试将pandas数据框推入dask数据框。

# Don't do this
new = df.map_partitions(f).compute() 
df['new'] = new  # tries to put a pandas dataframe into a dask dataframe