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

时间:2018-08-13 22:00:50

标签: python pandas pandas-groupby dask

我目前正在使用较小的数据集(约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的方式进行,这比以下顺序要快:

  1. 按索引分组
  2. 外部将每个组与自身联系在一起,以产生配对
  3. dataframe.apply对对的每一行上的比较功能

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

2 个答案:

答案 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)

  1. 您可以考虑将问题表述为加入操作
  2. 您可以考虑使用分类来减少内存使用量