基于Multindex和数据框(比较矩阵)

时间:2018-03-28 15:22:36

标签: python pandas dataframe comparison multi-index

我想基于数据帧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

Dataframe看起来像这样:

     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的方式,请随意发布它。)

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

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

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

因此, 问题1:我如何构建一个比较矩阵,它从pandas MultiIndex和初始df的值中得出每对的绝对差值。

比较DataFrame

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:如何添加查找索引对的新列和映射表以定义哪一对匹配?

比较矩阵/ DataFrame与匹配列

    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

1 个答案:

答案 0 :(得分:2)

这是使用zoomLevel + reindex

创建新df的一种方法
get_level_values

更新

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