根据具有不同索引的参考数据帧连接数据帧中的特定列对

发布于 2021-01-29 16:40:13

我的目标是根据在单独的数据框(参考)中描述的对来串联数据框(源)中的列。结果数据框应将“源”中的列标题替换为“引用”中的索引标签。

用于引用的数据框如下所示:

df1 = pd.DataFrame(dict(
    FIRST=['Alpha', 'Alpha', 'Charlie'],
    SECOND=['Bravo', 'Delta', 'Delta']
), ['H1', 'H2', 'H3'])

df1

      FIRST SECOND
H1    Alpha  Bravo
H2    Alpha  Delta
H3  Charlie  Delta

用作数据源的数据框:

df2 = pd.DataFrame(dict(
    Alpha=['A', 'C'],
    Bravo=['A', 'C'],
    Delta=['T', 'C'],
    Charlie=['T', 'G']
), ['item-000', 'item-111'])

df2

           Alpha Bravo Charlie Delta
item-000     A     A       T     T
item-111     C     C       G     C

结果数据框将如下所示:

          H1  H2  H3
item-000  AA  AT  TT
item-111  CC  CC  GC

问题
使用当前设置可以做到这一点,还是最好更改数据所在的格式?

关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    解决方案
    使用pd.get_dummiespd.DataFrame.dot

    df2.dot(pd.get_dummies(df1.stack()).T).sum(1, level=0)
    
              H1  H2  H3
    item-000  AA  AT  TT
    item-111  CC  CC  GC
    

    说明

    我知道我想使用点积。矩阵相乘的规则是,将n x k矩阵乘以k x m矩阵会得到一个n x m矩阵。查看最终结果,我['item-000', 'item-111']在索引中看到了,这就是我nn x k矩阵。我看一下我的初步数据帧,['item-000', 'item-111']在列或索引中是否有一个?我做!

    df2
    
               Alpha Bravo Charlie Delta
    item-000     A     A       T     T
    item-111     C     C       G     C
    

    那暗示我k['Alpha', 'Bravo', 'Charlie', 'Delta']。好的,所以现在我必须寻找k x m。我仅有的其他数据框是df1,看起来像的东西['Alpha', 'Bravo', 'Charlie', 'Delta']在值中……
    而不是 列或索引中。所以我必须到那里。我决定堆叠df1使用pd.get_dummies

    pd.get_dummies(df1.stack())
    
               Alpha  Bravo  Charlie  Delta
    H1 FIRST       1      0        0      0
       SECOND      0      1        0      0
    H2 FIRST       1      0        0      0
       SECOND      0      0        0      1
    H3 FIRST       0      0        1      0
       SECOND      0      0        0      1
    

    现在我['Alpha', 'Bravo', 'Charlie', 'Delta']在专栏中!那是我的k。但我在索引中需要它。没问题,请使用移调。

    pd.get_dummies(df1.stack()).T
    
               H1           H2           H3       
            FIRST SECOND FIRST SECOND FIRST SECOND
    Alpha       1      0     1      0     0      0
    Bravo       0      1     0      0     0      0
    Charlie     0      0     0      0     1      0
    Delta       0      0     0      1     0      1
    

    对!现在我准备好了dot

    df2.dot(pd.get_dummies(df1.stack()).T)
    
                H1           H2           H3       
             FIRST SECOND FIRST SECOND FIRST SECOND
    item-000     A      A     A      T     T      T
    item-111     C      C     C      C     G      C
    

    我们就快到了。我进行连接,FIRSTSECOND使用pd.DataFrame.sum指定的位置进行汇总,并按列对象的第一级分组。

    df2.dot(pd.get_dummies(df1.stack()).T).sum(1, level=0)
    
              H1  H2  H3
    item-000  AA  AT  TT
    item-111  CC  CC  GC
    

    设定

    df1 = pd.DataFrame(dict(
        FIRST=['Alpha', 'Alpha', 'Charlie'],
        SECOND=['Bravo', 'Delta', 'Delta']
    ), ['H1', 'H2', 'H3'])
    
    df2 = pd.DataFrame(dict(
        Alpha=['A', 'C'],
        Bravo=['A', 'C'],
        Delta=['T', 'C'],
        Charlie=['T', 'G']
    ), ['item-000', 'item-111'])
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看