【问题标题】:Pairwise row match of tables in PythonPython中表的成对行匹配
【发布时间】:2020-05-19 16:02:07
【问题描述】:

我正在尝试对 100 多个表进行成对比较,以通过“ID”找到共同的行。 有没有一种简单的方法可以在不经过很多循环的情况下进行这种成对比较?

预期的输出是一个矩阵/热图,显示表之间的相似性,表之间有共同的行数。

附上我的表格样本。它们都保存在我机器上的同一目录中。

谢谢,

【问题讨论】:

    标签: python dataframe rows pairwise


    【解决方案1】:

    如果我理解正确,您只需要 ID 列的成对相似性,而不管 Value 列是否具有该 ID 的不同值。假设您的表表示为名为“dfs”的数据框列表:

    m = np.zeros(shape=(len(dataframes), len(dataframes)))
    for i, d in enumerate(dataframes):
        for j, d_ in enumerate(dataframes):
            commons = len(set(d.ID).intersection(set(d_.ID)))
            m[i][j] = commons
    df = pd.DataFrame(m).applymap(int)
    print(df)
    

    【讨论】:

    • 感谢您的回答@SimonR。这对 2 个 dfs 来说就像一个魅力,但是一旦我用 3 个 dfs 尝试它,我在嵌套的 for 循环内的衬里上出现了一个回溯错误“回溯(最近一次调用最后一次):文件“”,第 3 行,在 IndexError: index 2 is out of bounds for axis 0 with size 2"
    • 这很好奇:我用三个数据框测试了它,它运行良好。在我的回答中使用 len(dfs) 对 numpy 数组进行整形应该确保您永远不会收到 IndexError。
    【解决方案2】:

    您可以在这种情况下使用 numpy 我假设所有数据都是这样的数据框:

    id1 = ['A','B','C','D','E','F','G','H','I']
    Value1 = np.random.random((len(id1),))
    data1 = pd.DataFrame({'ID':id1,'Value':Value1})
    id2 = ['O','P','A','C','R','T','U','L','M','B','E']
    Value2 = np.random.random((len(id2),))
    data2 = pd.DataFrame({'ID':id2,'Value':Value2})
    

    我们将从 data1 中获取值,使用 numpy.in1d,如下所示:

    result1 = data1[np.in1d(data1['ID'],data2['ID'])]
    

    或者我们将从 data2 中获取值,如下所示:

    result2 = data2[np.in1d(data2['ID'],data1['ID'])]
    

    结果:

    >>> result1
      ID     Value
    0  A  0.213569
    1  B  0.483985
    2  C  0.888146
    4  E  0.812130
    >>> result2
       ID     Value
    2   A  0.875728
    3   C  0.690587
    9   B  0.793642
    10  E  0.679874
    >>> 
    

    【讨论】:

      猜你喜欢
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多