我的目标是连接数据帧(源)中的列,基于对
在单独的数据帧(引用)中进行了描述。生成的数据框应该用引用中的索引标签替换源中的列标题。
用于引用的数据框如下所示:
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_dummies
和 pd.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
连接 SECOND
和 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'])
关于python - 根据具有不同索引的引用数据帧连接数据帧中的特定列对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46594156/