我想组合两个熊猫数据帧以产生一个矩阵。这两个数据帧不共享公共索引值,并且确实是独立的。相反,我想使用两组索引来使用具有两个索引所有可能组合的分层索引生成新的数据帧。这些列应采用原始数据帧中的值。
这是我要结合的两个数据框的简化版本:
df1
Cat Freq
1.1 A 4
1.2 B 8
1.3 C 2
1.4 A 5
df2
Cat Freq
2.1 A 4
2.2 C 4
2.3 C 2
2.4 A 7
这就是我要创建的:
df_merged
Cat(1) Freq(1) Cat(2) Freq(2)
1.1 2.1 A 4 A 4
2.2 A 4 C 4
2.3 A 4 C 2
2.4 A 4 A 7
1.2 2.1 B 8 A 4
2.2 B 8 C 4
2.3 B 8 C 2
.. ... .... ....... ....... .......
.. ... .... ........ ....... .......
最终,我想基于频率最大的那个创建一个带有类别字母(源自df1或df2)的新列。这样,我将能够形成一个矩阵。如果可以上述形式获取数据,我认为这最后一步将非常简单。
非常感谢!
答案 0 :(得分:1)
创建的reindex
和from_product
中最后一个concat
和add_suffix
都由DataFrames
和MultiIndex
使用merge
:
mux = pd.MultiIndex.from_product([df1.index, df2.index])
df1 = df1.reindex(mux, level=0)
df2 = df2.reindex(mux, level=1)
df = pd.concat([df1.add_suffix('(1)'), df2.add_suffix('(2)')], axis=1)
print (df)
Cat(1) Freq(1) Cat(2) Freq(2)
1.1 2.1 A 4 A 4
2.2 A 4 C 4
2.3 A 4 C 2
2.4 A 4 A 7
1.2 2.1 B 8 A 4
2.2 B 8 C 4
2.3 B 8 C 2
2.4 B 8 A 7
1.3 2.1 C 2 A 4
2.2 C 2 C 4
2.3 C 2 C 2
2.4 C 2 A 7
1.4 2.1 A 5 A 4
2.2 A 5 C 4
2.3 A 5 C 2
2.4 A 5 A 7
或者将reset_index
与{{3}}进行交叉连接,以避免丢失索引值:
df = (df1.reset_index().assign(A=1)
.merge(df2.reset_index().assign(A=1), on='A', suffixes=('(1)','(2)'))
.set_index(['index(1)','index(2)'])
.drop('A', axis=1)
.rename_axis((None,None)))
print (df)
Cat(1) Freq(1) Cat(2) Freq(2)
1.1 2.1 A 4 A 4
2.2 A 4 C 4
2.3 A 4 C 2
2.4 A 4 A 7
1.2 2.1 B 8 A 4
2.2 B 8 C 4
2.3 B 8 C 2
2.4 B 8 A 7
1.3 2.1 C 2 A 4
2.2 C 2 C 4
2.3 C 2 C 2
2.4 C 2 A 7
1.4 2.1 A 5 A 4
2.2 A 5 C 4
2.3 A 5 C 2
2.4 A 5 A 7