Pandas的有效成对计算

2024-05-19 11:03:41 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一些行的分类数据,我想用这些行之间的差异数来计算成对矩阵。在

例如,将值为[1, 0, 0, 1]的行与值为[0, 0, 1, 1]的行进行比较,得到的结果值是2,因为索引0和索引2不同。在

我想做一个矩阵,显示每一对组合行。我为此编写了代码,但是在处理大数据时效率很低。我知道一定有一种方法可以更有效地实现这一点,因为只需要计算矩阵的上半部分。在

不过,我不知道如何将其转换为代码。以下是我目前所掌握的情况:

shortened = pd.DataFrame(
    [{'c1':1, 'c2':0, 'c3':0}, {'c1':1,'c2':1, 'c3':0}, {'c1':0,'c2':0, 'c3':1}]
)
distm = [[""]+ list(shortened.index)]
found = {}
for index,row in shortened.iterrows():
    newrow = [index]
    for i2,r2 in shortened.iterrows():
        if((i2,index) in found):
            newrow.append(found[(i2,index)])
            continue
        if(index == i2):
            newrow.append(0)
            continue
        summeddif = sum(i != j for i, j in zip(row, r2))
        newrow.append(summeddif)
        found[(index,i2)] = summeddif
    distm.append(newrow)

因此,通过这里的数据帧示例,可以获得正确的输出:

^{pr2}$

然而,由于输入量很大,这需要花费很长时间。有没有一种优雅的方法只迭代上半部分,然后简单地复制到下半部分,这样我就不需要进行不必要的比较了?或者没有其他方法可以通过熊猫来改善这种状况吗?在


Tags: 数据方法inforindex矩阵c2c1
1条回答
网友
1楼 · 发布于 2024-05-19 11:03:41

使用广播的异或。

(shortened.values ^ shortened.values[:, None]).sum(2)

array([[0, 1, 2],
       [1, 0, 3],
       [2, 3, 0]])

异或是检查两个位是否相同的最简单(也是最快)的方法。只要您的输入是二进制的,这应该可以工作。

请注意,这是内存密集型的,特别是对于非常大的帧,有可能在大约1M行处出现OOM。

相关问题 更多 >

    热门问题