我想基于数据帧df创建一个比较矩阵。

让我们假设下面的数据框。

df= pd.DataFrame({'row'   : ['a','b','c','d'],
                   'col_A' : [1,2,3,4],
                   'col_B' : [1,2,3,4],
                   'col_C' : [1,2,3,4],
                   'col_D' : [1,2,3,4]});df

 df = df.set_index('row');df


数据框如下所示:

     col_A  col_B  col_C  col_D
row
a        1      1      1      1
b        2      2      2      2
c        3      3      3      3
d        4      4      4      4


我也有一个如下所示的映射,其中a和b以及c和d是相同的实体。

mapping = pd.DataFrame({'row'   : ['a','b','c','d'],
                        'Mapping' : ['b','a','d','c']}).set_index('row');mapping


因此,我想构造一个新的数据框,其中包含df索引的所有可能组合,但不能重复。
我已经设法通过pandas MultiIndex功能为新的比较数据框创建了索引(如果您可以考虑采用更多的pyhtonic方法,也可以随时发布它)。

创建熊猫多索引(所有可能的组合,但不可重复)

arrays = [['a', 'a', 'a', 'b', 'b', 'c'],
          ['b', 'c', 'd', 'c', 'd', 'd']]

index = pd.MultiIndex.from_tuples(tuples, names=['IndexA', 'IndexB'])


因此,
问题1:如何构造一个比较矩阵,该矩阵采用大熊猫MultiIndex中每对的绝对差和初始df中的值。

比较数据框

IndexA  IndexB  Col_A   Col_B   Col_C   Col_D
   a       b      1       1      1        1
   a       c      2       2      2        2
   a       d      3       3      3        3
   b       c      1       1      1        1
   b       d      1       1      1        1
   c       d      1       1      1        1


问题2:如何添加新列来查找索引对和映射表以定义匹配的对?

具有匹配列的比较矩阵/数据框

    IndexA  IndexB   Col_A   Col_B  Col_C   Col_D   Match
       a       b      1       1      1        1      1
       a       c      2       2      2        2      0
       a       d      3       3      3        3      0
       b       c      1       1      1        1      0
       b       d      1       1      1        1      0
       c       d      1       1      1        1      1

最佳答案

这是使用reindex + get_level_values创建新df的一种方法

pd.DataFrame(-df.reindex(index.get_level_values(0)).values+df.reindex(index.get_level_values(1)).values,index=index,columns=df.columns)
Out[215]:
               col_A  col_B  col_C  col_D
IndexA IndexB
a      b           1      1      1      1
       c           2      2      2      2
       d           3      3      3      3
b      c           1      1      1      1
       d           2      2      2      2
c      d           1      1      1      1


更新资料

df=pd.DataFrame(-df.reindex(index.get_level_values(0)).values+df.reindex(index.get_level_values(1)).values,index=index,columns=df.columns)

s=mapping.assign(match=1).set_index('Mapping',append=True)
pd.concat([df,s.reindex(df.index)],1).fillna(0)
Out[249]:
               col_A  col_B  col_C  col_D  match
IndexA IndexB
a      b           1      1      1      1    1.0
       c           2      2      2      2    0.0
       d           3      3      3      3    0.0
b      c           1      1      1      1    0.0
       d           2      2      2      2    0.0
c      d           1      1      1      1    1.0

10-04 21:43
查看更多