从两个现有数据框创建两个新数据框,同时考虑它们的多索引列及其值的所有组合
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
# 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
平面索引值。
我想根据两个现有数据框创建两个新数据框,同时考虑它们的多索引列及其值的所有组合。
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
# 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
平面索引值。