【问题标题】:Create a MultiIndex Dataframe based on a Multindex and a dataframe (Comparison Matrix)基于多索引和数据框(比较矩阵)创建多索引数据框
【发布时间】:2018-03-28 15:22:35
【问题描述】:

我想根据数据框 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 的方式,请随时发布它)。

创建 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 中的值。

比较数据框

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

【问题讨论】:

  • 注意原始df的每一行都包含相同的值
  • 我明白你的意思。让我纠正一下。

标签: python pandas dataframe comparison multi-index


【解决方案1】:

这是创建新 df 的一种方法,使用 reindex +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

更新

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

【讨论】:

  • 文,干得好伙伴。关于如何基于双索引查找以带来新列 Match 的任何想法?
  • 你是明星!如果您可以为此类操作推荐任何好的教程/资源,我将不胜感激。谢谢!
  • @A.Papa coursera 里面有很多在线教程,如果你需要这个可以考虑接受吗?
  • @A.Papa,如果您认为 accepting / upvoting 回答了您的问题,请考虑回答
  • 哦,文,我和你一起学习了很多!谢谢。答案已检查!
猜你喜欢
  • 2020-10-08
  • 1970-01-01
  • 2018-06-12
  • 2021-05-07
  • 2023-03-23
  • 2020-10-22
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
相关资源
最近更新 更多