根据具有不同索引的参考数据帧连接数据帧中的特定列对
问题内容:
我的目标是根据在单独的数据框(参考)中描述的对来串联数据框(源)中的列。结果数据框应将“源”中的列标题替换为“引用”中的索引标签。
用于引用的数据框如下所示:
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'])