Существует ли противоположная функция pandas.DataFrame.droplevel (например, keeplevel)? - PullRequest
2 голосов
/ 23 сентября 2019

Есть ли противоположная функция pandas.DataFrame.droplevel, где я могу сохранить некоторые уровни многоуровневого индекса / столбцов, используя либо имя уровня, либо индекс?

Пример:

df = pd.DataFrame([
        [1, 2, 3, 4],
        [5, 6, 7, 8],
        [9, 10, 11, 12],
        [13, 14, 15, 16]
    ], columns=['a','b','c','d']).set_index(['a','b','c']).T


a   1   5   9   13
b   2   6   10  14
c   3   7   11  15
d   4   8   12  16

Обе следующие команды могут возвращать следующий фрейм данных:

df.droplevel(['a','b'], axis=1)
df.droplevel([0, 1], axis=1)

c   3   7   11  15
d   4   8   12  16

Я ищу команду "keeplevel", чтобы обе следующие команды могли возвращать следующий фрейм данных:

df.keeplevel(['a','b'], axis=1)
df.keeplevel([0, 1], axis=1)

a   1   5   9   13
b   2   6   10  14
d   4   8   12  16

Ответы [ 3 ]

5 голосов
/ 23 сентября 2019

Нет keeplevel, потому что это было бы избыточно: в закрытом и четко определенном наборе, когда вы определяете, что вы хотите отбросить, вы автоматически определяете, что вы хотите сохранить

Вы можете получитьразница от того, что у вас есть и что droplevel возвращает.

def keeplevel(df, levels, axis=1):
    return df.droplevel(df.axes[axis].droplevel(levels).names, axis=axis)

>>> keeplevel(df, [0, 1])

a   1   5   9   13
b   2   6   10  14
d   4   8   12  16
3 голосов
/ 23 сентября 2019

Использование set для поиска другого

df.droplevel(list(set(df.columns.names)-set(['a','b'])),axis=1)
Out[134]: 
a 1  5   9   13
b 2  6   10  14
d  4  8  12  16
2 голосов
/ 23 сентября 2019

Вы можете изменить объекты Index, что должно быть быстрым.Обратите внимание, это даже изменит на месте.

def keep_level(df, keep, axis):
    idx = pd.MultiIndex.from_arrays([df.axes[axis].get_level_values(x) for x in keep])
    df.set_axis(idx, axis=axis, inplace=True)
    return df

keep_level(df.copy(), ['a', 'b'], 1)  # Copy to not modify original for illustration
#a 1  5   9   13
#b 2  6   10  14
#d  4  8  12  16

keep_level(df.copy(), [0, 1], 1)
#a 1  5   9   13
#b 2  6   10  14
#d  4  8  12  16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...