Я пытаюсь установить все значения столбца в многоиндексированном панде DataFrame, указав только данные для одного уровня индекса.Решение, которое я нашел до сих пор, является неудовлетворительным, но это, вероятно, лучше всего объяснить кодом:
from pandas import MultiIndex, DataFrame
idx = MultiIndex.from_product([['A', 'B'], [1, 2, 3]],
names=['Cases', 'Time'])
parameters = DataFrame(index=idx)
parameters['CaseAndTimeInvariant'] = 1
parameters['CaseAndTimeVariant'] = 1, 2, 3, 4, 5, 6
# Set the values in 'Time' for all cases to 1, 2, 3
parameters['CaseInvariantTimeVariant'] = 1, 2, 3
# ValueError: Length of values does not match length of index
Ошибка совершенно очевидна, поскольку я нигде не указываю, для какого уровня данные должныбыть.Например, если бы у меня был другой «случай», длины данных было бы недостаточно, чтобы определить, что я имею в виду с последней строкой кода выше.
Что мне, очевидно, нужно сделать, это сказать parameters
, чтоДанные, которые я передаю, предназначены для уровня индекса «Время».Однако все попытки, которые я обнаружил с помощью loc
-индексирования, приводят к:
- другим фреймам данных или сериям с полной длиной или
- требуют указания отдельных сценариев
В настоящее время я делаю следующее:
for c in parameters.index.levels[0]:
parameters.loc[(c, slice(None)), 'CaseInvariantTimeVariant'] = 1, 2, 3
, что приводит к:

Хотя это делает то, чтоЯ хочу, чтобы он чувствовал себя неудовлетворительно по двум причинам:
- ему нужны две довольно загадочные строки, чтобы сделать что-то, казалось бы, простое: (Установите все значения для
Time
, используя эту итерацию, которую я вам даю!) - мы должны явно выполнять итерации по всем уровням индекса, которые обрабатываются одинаково, так что это не обобщает более чем на два уровня
Кажется, что 'groupby' может быть полезнымздесь, но до сих пор я не смог составить большую часть документации.