我的目标是连接数据框(来源)中的列,基于对 在单独的数据框(引用)中进行了描述。生成的数据框应将源中的列标题替换为引用中的索引标签。
用于引用的数据框如下所示:
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
马上开始!现在我准备好点
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
连接了 FIRST
和 SECOND
列对象。
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/