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


问题内容

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

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

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

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


问题答案:

解决方案
使用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'])