猿问

熊猫DataFrame中行的高效成对比较

我目前正在使用较小的数据集(约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

显然,组合爆炸将无法将每个记录与其他每个记录进行比较。因此,我们可以通过在group A上应用groupby来使用阻塞。


我的问题是,有没有一种方法可以以大熊猫或dask的方式执行此操作,该方法比以下顺序更快:

  1. 按索引分组

  2. 外部将每个组结合起来以产生对

  3. 在成对的每一行上使用dataframe.apply比较函数

作为参考,假设我可以访问大量内核(数百个)以及大约200G的内存。


哈士奇WWW
浏览 166回答 2
2回答

慕田峪9158850

原来该解决方案是使用numpy代替步骤3)。虽然我们无法创建每一行的外部联接,但是我们可以按A列中的值进行分组,并为外部联接创建较小的组。诀窍在于使用numpy.equal.outer(df1, df2).ravel()当将数据帧以这种方式作为输入传递给numpy函数时,结果将是更快(至少30倍)的向量化结果。例如:>>> df = pd.DataFrame   A   B     C      D0 cat blue  old Saturday1 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     D0, 0  True   NaN   NaN   NaN  0, 1  False  NaN   NaN   NaN  1, 0  False  NaN   NaN   NaN  1, 1  True   NaN   NaN   NaN  您可以为每列重复,也可以只对结果逐列应用即可自动执行该过程。

慕尼黑的夜晚无繁华

您可以考虑将问题表述为联接操作您可能会考虑使用分类来减少内存使用
随时随地看视频慕课网APP

相关分类

Python
我要回答