我想從兩個現有資料框創建兩個新資料框,同時考慮到它們的多索引列及其值的所有組合。
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:對不起,如果我的問題不夠準確,但是具有預期結果的示例仍然可以最好地解釋它。也許這個問題已經被問到,但是在沒有準確描述我真正想要什么樣的結果的情況下(在兩個 DataFrames 中組合?),我請你幫助更精確地制定問題或將其鏈接為副本,如果存在一個現有問題。
uj5u.com熱心網友回復:
我們可以使用MultiIndex.from_product基于每個 DataFrame的平面索引然后reindex基于相應的級別值:
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平指數值。
uj5u.com熱心網友回復:
在列 ( )上使用DataFrame.reindex Index.repeataxis=1
# 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/358444.html
