为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哈士奇WWW 2021-05-16 12:01:39
我目前正在使用较小的数据集(约900万行)。不幸的是,大多数条目都是字符串,即使强制使用类别,框架的内存也只有几GB。我想做的是将每一行与其他行进行比较,并对内容进行直接比较。例如,给定   A   B     C      D0 cat blue  old Saturday1 dog red   old Saturday我想算一下      d_A   d_B   d_C   d_D0, 0  True  True  True  True0, 1  False False True  True1, 0  False False True  True1, 1  True  True  True  True显然,组合爆炸将无法将每个记录与其他每个记录进行比较。因此,我们可以通过在group A上应用groupby来使用阻塞。我的问题是,有没有一种方法可以以大熊猫或dask的方式执行此操作,该方法比以下顺序更快:按索引分组外部将每个组结合起来以产生对在成对的每一行上使用dataframe.apply比较函数作为参考,假设我可以访问大量内核(数百个)以及大约200G的内存。
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

原来该解决方案是使用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  

您可以为每列重复,也可以只对结果逐列应用即可自动执行该过程。


查看完整回答
反对 回复 2021-05-25
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

  1. 您可以考虑将问题表述为联接操作

  2. 您可能会考虑使用分类来减少内存使用


查看完整回答
反对 回复 2021-05-25
  • 2 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号