从两个现有数据框创建两个新数据框,同时考虑它们的多索引列及其值的所有组合

Create two new data frames from two existing data frames, taking into account all combinations of their multi-index columns and their values

我想根据两个现有数据框创建两个新数据框,同时考虑它们的多索引列及其值的所有组合。

left = pd.DataFrame(([1,0,1], [1,0,0],[1,0,1],), columns=pd.MultiIndex.from_tuples([('A', 'B'), ('A', 'C' ), ('D','D'),]))
right = pd.DataFrame(([8,9], [8,9],[8,9],), columns=pd.MultiIndex.from_tuples([('S', 'T'), ('Y', 'Z'),]))
左:
   A  A  D
   B  C  D
0  1  0  1
1  1  0  0
2  1  0  1
对:
   S  Y
   T  Z
0  8  9
1  8  9
2  8  9
预期输出
left_result:
   A  A  A  A  D  D
   B  B  C  C  D  D
0  1  1  0  0  1  1
1  1  1  0  0  0  0
2  1  1  0  0  1  1
right_result:
   S  Y  S  Y  S  Y
   T  Z  T  Z  T  Z
0  8  9  8  9  8  9
1  8  9  8  9  8  9
2  8  9  8  9  8  9

PS:对不起,如果我的问题不够精确,但预期结果的例子仍然是最好的解释。也许这个问题已经被问过了,但由于没有准确描述我真正想要什么样的结果(两个 DataFrame 的组合?),我请你帮助更准确地提出问题或 link 它如果存在现有问题,则重复。

在列 (axis=1)

上使用 DataFrame.reindex + Index.repeat
# repeat 'left' columns 2 times 
>>> left = left.reindex(left.columns.repeat(2), axis=1)
>>> left

   A           D   
   B  B  C  C  D  D
0  1  1  0  0  1  1
1  1  1  0  0  0  0
2  1  1  0  0  1  1

# repeat 'right' columns 3 times 
>>> right = right.reindex(right.columns.repeat(3), axis=1)
>>> right 

   S        Y      
   T  T  T  Z  Z  Z
0  8  8  8  9  9  9
1  8  8  8  9  9  9
2  8  8  8  9  9  9

pandas.concat

# concatenate 'right' 3 times side by side (axis=1)
>>> right = pd.concat([right]*3, axis=1)
>>> right

   S  Y  S  Y  S  Y
   T  Z  T  Z  T  Z
0  8  9  8  9  8  9
1  8  9  8  9  8  9
2  8  9  8  9  8  9

我们可以使用MultiIndex.from_product based on the flat index of each DataFrame then reindex based on the corresponding level values:

midx = pd.MultiIndex.from_product([left.columns.to_flat_index(),
                                   right.columns.to_flat_index()])

left = left.reindex(columns=midx.get_level_values(0))
right = right.reindex(columns=midx.get_level_values(1))

left:

   A           D   
   B  B  C  C  D  D
0  1  1  0  0  1  1
1  1  1  0  0  0  0
2  1  1  0  0  1  1

right:

   S  Y  S  Y  S  Y
   T  Z  T  Z  T  Z
0  8  9  8  9  8  9
1  8  9  8  9  8  9
2  8  9  8  9  8  9

midx供参考:

MultiIndex([(('A', 'B'), ('S', 'T')),
            (('A', 'B'), ('Y', 'Z')),
            (('A', 'C'), ('S', 'T')),
            (('A', 'C'), ('Y', 'Z')),
            (('D', 'D'), ('S', 'T')),
            (('D', 'D'), ('Y', 'Z'))],
           )

注意:级别 0 是 left 平面索引值,级别 1 是 right 平面索引值。