gpt4 book ai didi

python - 基于Multiindex和dataframe创建MultiIndex Dataframe(比较矩阵)

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:33 26 4
gpt4 key购买 nike

我想基于数据帧 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 的方式,也请随时发布)。

创建 pandas Multi 索引(所有可能的组合但不重复)

arrays = [['a', 'a', 'a', 'b', 'b', 'c'],
['b', 'c', 'd', 'c', 'd', 'd']]

index = pd.MultiIndex.from_tuples(tuples, names=['IndexA', 'IndexB'])

因此,问题 1:如何构造一个比较矩阵,该矩阵取 pandas 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:如何添加一个新的列来查找索引对和映射表来定义匹配的对?

具有匹配列的比较矩阵/DataFrame

    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

最佳答案

这是创建新 df 的一种方法,使用 reindex +get_level_values

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

关于python - 基于Multiindex和dataframe创建MultiIndex Dataframe(比较矩阵),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49538374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com