我的目标是连接数据帧(源)中的列,基于对
在单独的数据帧(引用)中进行了描述。生成的数据框应该用引用中的索引标签替换源中的列标题。

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

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'],也就是我的 n 矩阵中的 n 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

我们就快到了。我使用 FIRST 连接 SECONDpd.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'])

关于python - 根据具有不同索引的引用数据帧连接数据帧中的特定列对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46594156/

10-12 22:01
查看更多