我目前正在使用较小的数据集(约900万行)。不幸的是,大多数条目都是字符串,即使强制使用类别,框架的内存也只有几GB。
我想做的是将每一行与其他行进行比较,并对内容进行直接比较。例如,给定
A B C D
0 cat blue old Saturday
1 dog red old Saturday
我想计算
d_A d_B d_C d_D
0, 0 True True True True
0, 1 False False True True
1, 0 False False True True
1, 1 True True True True
很明显,组合爆炸将排除将每条记录与其他每条记录进行比较。因此,我们可以通过在A列上应用groupby来使用阻止功能。
我的问题是,有没有一种方法可以以大熊猫或dask的方式进行,这比以下顺序要快:
作为参考,假设我可以访问大量内核(数百个)以及大约200G的内存。
答案 0 :(得分:2)
该解决方案原来是使用numpy代替步骤3)。虽然我们无法创建每一行的外部联接,但可以按A列中的值进行分组,并为外部联接创建较小的组。
然后的诀窍是使用numpy.equal.outer(df1, df2).ravel()
,当以这种方式将数据帧作为输入传递给numpy函数时,结果将是更快的向量化结果(至少30倍)。例如:
>>df = pd.DataFrame
A B C D
0 cat blue old Saturday
1 dog red old Saturday
>>result = pd.DataFrame(columns=["A", "B", "C", "D"],
index=pd.MultiIndex.from_product([df.index, df.index]))
>>result["A"] = np.equal.outer(df["A"], df["A"]).ravel
>>result
A B C D
0, 0 True NaN NaN NaN
0, 1 False NaN NaN NaN
1, 0 False NaN NaN NaN
1, 1 True NaN NaN NaN
您可以为每列重复操作,也可以只对结果进行逐列自动操作。
答案 1 :(得分:0)