我想基于数据帧df创建一个比较矩阵。
让我们假设下面的数据框。
df= pd.DataFrame({'row' : ['a','b','c','d'],
'col_A' : [1,2,3,4],
'col_B' : [1,2,3,4],
'col_C' : [1,2,3,4],
'col_D' : [1,2,3,4]});df
df = df.set_index('row');df
数据框如下所示:
col_A col_B col_C col_D
row
a 1 1 1 1
b 2 2 2 2
c 3 3 3 3
d 4 4 4 4
我也有一个如下所示的映射,其中a和b以及c和d是相同的实体。
mapping = pd.DataFrame({'row' : ['a','b','c','d'],
'Mapping' : ['b','a','d','c']}).set_index('row');mapping
因此,我想构造一个新的数据框,其中包含df索引的所有可能组合,但不能重复。
我已经设法通过pandas MultiIndex功能为新的比较数据框创建了索引(如果您可以考虑采用更多的pyhtonic方法,也可以随时发布它)。
创建熊猫多索引(所有可能的组合,但不可重复)
arrays = [['a', 'a', 'a', 'b', 'b', 'c'],
['b', 'c', 'd', 'c', 'd', 'd']]
index = pd.MultiIndex.from_tuples(tuples, names=['IndexA', 'IndexB'])
因此,
问题1:如何构造一个比较矩阵,该矩阵采用大熊猫MultiIndex中每对的绝对差和初始df中的值。
比较数据框
IndexA IndexB Col_A Col_B Col_C Col_D
a b 1 1 1 1
a c 2 2 2 2
a d 3 3 3 3
b c 1 1 1 1
b d 1 1 1 1
c d 1 1 1 1
问题2:如何添加新列来查找索引对和映射表以定义匹配的对?
具有匹配列的比较矩阵/数据框
IndexA IndexB Col_A Col_B Col_C Col_D Match
a b 1 1 1 1 1
a c 2 2 2 2 0
a d 3 3 3 3 0
b c 1 1 1 1 0
b d 1 1 1 1 0
c d 1 1 1 1 1
最佳答案
这是使用reindex
+ get_level_values
创建新df的一种方法
pd.DataFrame(-df.reindex(index.get_level_values(0)).values+df.reindex(index.get_level_values(1)).values,index=index,columns=df.columns)
Out[215]:
col_A col_B col_C col_D
IndexA IndexB
a b 1 1 1 1
c 2 2 2 2
d 3 3 3 3
b c 1 1 1 1
d 2 2 2 2
c d 1 1 1 1
更新资料
df=pd.DataFrame(-df.reindex(index.get_level_values(0)).values+df.reindex(index.get_level_values(1)).values,index=index,columns=df.columns)
s=mapping.assign(match=1).set_index('Mapping',append=True)
pd.concat([df,s.reindex(df.index)],1).fillna(0)
Out[249]:
col_A col_B col_C col_D match
IndexA IndexB
a b 1 1 1 1 1.0
c 2 2 2 2 0.0
d 3 3 3 3 0.0
b c 1 1 1 1 0.0
d 2 2 2 2 0.0
c d 1 1 1 1 1.0