В numpy
мы можем выбрать последнюю ось с индексированием многоточием, fi array[..., 4]
.
В Pandas
DataFrames для структурирования больших объемов данных, мне нравится использовать MultiIndex
(который я видятся как некие дополнительные измерения DataFrame). Если я хочу выбрать заданное подмножество DataFrame df
, в этом случае все столбцы 'key'
на последнем уровне столбцов MultiIndex
, я могу сделать это с помощью метода перекрестного выбора xs
:
# create sample multiindex dataframe
mi = pd.MultiIndex.from_product((('a', 'b', 'c'), (1, 2), ('some', 'key', 'foo')))
data = pd.DataFrame(data=np.random.rand(20, 18), columns=mi)
# make cross selection:
xs_df = data.xs('key', axis=1, level=-1)
Но если я хочу присвоить значения перекрестному выбору, xs
не будет работать.
В документации предлагается использовать IndexSlice
для доступа и установить значений для перекрестного выбора:
idx = pd.IndexSlice
data.loc[:, idx[:, :, 'key']] *= 10
Что работает хорошо, пока I явно вводит количество уровней , вставляя правильное количество :
перед 'key'
.
Предполагая, что я просто хочу указать количество уровней функции выбора или всегда выбирать последний уровень, независимо от количества уровней DataFrame , это не будет work (afaik).
Мой текущий обходной путь использует None
фрагменты для n_levels
, чтобы пропустить:
n_levels = data.columns.nlevels - 1 # assuming I want to select the last level
data.loc[:, (*n_levels*[slice(None)], 'key')] *= 100
Это imho довольно неприятный и громоздкий обходной путь. Есть ли более питонический / лучший / лучший способ?