Разбить столбцы на мультииндекс с отсутствующими столбцами в панд



Это похоже на задачу, которую я задал здесь. Однако я обнаружил, что данные, с которыми я работаю, не всегда согласуются. Например, скажем:



import pandas as pd

df = pd.DataFrame(pd.DataFrame([[1,2,3,4],[5,6,7,8],[9,10,11,12]],columns=["X_a","Y_c","X_b","Y_a"]))

X_a Y_c X_b Y_a
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12


Теперь вы можете видеть, что X не имеет соответствующего столбца c и Y не имеет соответствующего столбца b. Теперь, когда я хочу создать многоуровневый индекс, Я хочу, чтобы фрейм данных выглядел следующим образом:

     X             Y
a b c a b c
0 1 3 -1 4 -1 2
1 5 7 -1 8 -1 6
2 9 11 -1 12 -1 10


Итак, как вы можете видеть, я хочу разделить таким образом, чтобы все столбцы верхнего уровня имели те же колонки нижнего уровня. Поскольку набор данных является positve, я думаю о заполнении недостающих столбцов с помощью -1, хотя я открыт для предложений по этому поводу. Самое близкое, что я нашел к своей проблеме, было Этот ответ. Однако я не могу заставить его как-то работать с многоуровневым индексом, как в моем предыдущем вопросе. Любая помощь ценится.

595   1  

1 ответ:

Создайте MultiIndex и установите df.columns.

idx = df.columns.str.split('_', expand=True)
idx
MultiIndex(levels=[['X', 'Y'], ['a', 'b', 'c']],
           labels=[[0, 1, 0, 1], [0, 2, 1, 0]])

df.columns = idx
Теперь, используя существующий MultiIndex, Создайте новый индекс и используйте его для reindex исходного.
idx = pd.MultiIndex.from_product([idx.levels[0], idx.levels[1]])
idx
MultiIndex(levels=[['X', 'Y'], ['a', 'b', 'c']],
       labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])

df.reindex(columns=idx, fill_value=-1)
   X          Y       
   a   b  c   a  b   c
0  1   3 -1   4 -1   2
1  5   7 -1   8 -1   6
2  9  11 -1  12 -1  10

Comments

    Ничего не найдено.