Почему df.at выдает ошибку KeyError с MultiIndex, а df.loc — нет? ⇐ Python
-
Anonymous
Почему df.at выдает ошибку KeyError с MultiIndex, а df.loc — нет?
У меня возникли проблемы с одной из моих функций после переключения с обычного индекса на мультииндекс, и я не знаю, как это решить. Позвольте мне взять DataFrame из документации pandas для pandas.DataFrame.at, чтобы проиллюстрировать проблему:
>>> df = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]], ... index=[4, 5, 6], columns=['A', 'B', 'C']) >>> дф А Б С 4 0 2 3 5 0 4 1 6 10 20 30 >>> df.at[4, 'B'] 2 Если вы теперь преобразуете это в MultiIndex, тот же вызов завершится ошибкой и выдаст ошибку KeyError:
>>> df = df.set_index("A", Append=True) >>> дф ДО Н.Э А 4 0 2 3 5 0 4 1 6 10 20 30 >>> df.at[4, 'B'] Traceback (последний вызов последний): Файл «», строка 1, в df.at[4, "Б"] ~~~~~^^^^^^^^ Файл «/.../pandas/core/indexing.py», строка 2419, в __getitem__ вернуть super().__getitem__(ключ) ^^^^^^^^^^^^^^^^^^^^^^^^^ Файл "/.../pandas/core/indexing.py", строка 2371, в __getitem__ return self.obj._get_value(*key, takeable=self._takeable) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл "/.../pandas/core/frame.py", строка 3882, в _get_value loc = engine.get_loc(индекс) ^^^^^^^^^^^^^^^^^^^^^^ Файл «pandas/_libs/index.pyx», строка 822, в pandas._libs.index.BaseMultiIndexCodesEn gine.get_loc Ключевая ошибка: 4 Такое поведение было бы нормальным, если бы loc вёл себя таким же образом, а это не так:
>>> df.loc[4, 'B'] А 0 2 Имя: B, тип d: int64 Конечно, это можно обойти, указав все уровни индекса...
df.at[(4,0), 'B'] 2 но, учитывая, что у меня довольно много уровней MultiIndex, это не кажется возможным решением. И использование loc, а затем добавление .iloc[0] тоже не кажется питоническим... Кто-нибудь знает, как заставить .at работать, не указывая больше, чем первый уровень?
У меня возникли проблемы с одной из моих функций после переключения с обычного индекса на мультииндекс, и я не знаю, как это решить. Позвольте мне взять DataFrame из документации pandas для pandas.DataFrame.at, чтобы проиллюстрировать проблему:
>>> df = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]], ... index=[4, 5, 6], columns=['A', 'B', 'C']) >>> дф А Б С 4 0 2 3 5 0 4 1 6 10 20 30 >>> df.at[4, 'B'] 2 Если вы теперь преобразуете это в MultiIndex, тот же вызов завершится ошибкой и выдаст ошибку KeyError:
>>> df = df.set_index("A", Append=True) >>> дф ДО Н.Э А 4 0 2 3 5 0 4 1 6 10 20 30 >>> df.at[4, 'B'] Traceback (последний вызов последний): Файл «», строка 1, в df.at[4, "Б"] ~~~~~^^^^^^^^ Файл «/.../pandas/core/indexing.py», строка 2419, в __getitem__ вернуть super().__getitem__(ключ) ^^^^^^^^^^^^^^^^^^^^^^^^^ Файл "/.../pandas/core/indexing.py", строка 2371, в __getitem__ return self.obj._get_value(*key, takeable=self._takeable) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл "/.../pandas/core/frame.py", строка 3882, в _get_value loc = engine.get_loc(индекс) ^^^^^^^^^^^^^^^^^^^^^^ Файл «pandas/_libs/index.pyx», строка 822, в pandas._libs.index.BaseMultiIndexCodesEn gine.get_loc Ключевая ошибка: 4 Такое поведение было бы нормальным, если бы loc вёл себя таким же образом, а это не так:
>>> df.loc[4, 'B'] А 0 2 Имя: B, тип d: int64 Конечно, это можно обойти, указав все уровни индекса...
df.at[(4,0), 'B'] 2 но, учитывая, что у меня довольно много уровней MultiIndex, это не кажется возможным решением. И использование loc, а затем добавление .iloc[0] тоже не кажется питоническим... Кто-нибудь знает, как заставить .at работать, не указывая больше, чем первый уровень?