python - 根据具有不同索引的引用数据帧连接数据帧中的特定列对

标签 python pandas

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

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

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

马上开始!现在我准备好

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

我们快到了。我使用 pd.DataFrame.sum 连接了 FIRSTSECOND列对象。

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/

相关文章:

python - Pandas + Matplotlib,让条形图中的一种颜色脱颖而出

python - SQLAlchemy 排序依据先于分组依据

python - 我可以安全地组合我的模式吗

python - 如果字符串中有空格,则在 telnetlib write 命令中将字符串与文本组合不起作用

python - pandas 中的链接 Melt 和 Groupby 会导致整数值转换为 bool 值

python - 具有多色 y 轴和相应颜色条的热图

python - (Python) 如何修复数据帧列值中的数字表示错误

python - 如何找到函数的所有 **args 的列表?

python - 从 Popen 捕获输出

python - 在Python中获取波兰语字符