Пожалуйста, ознакомьтесь со следующими простыми сценариями и дайте мне знать, если я делаю что-то не так, или, возможно, это ошибка в Pandas MultiIndex DataFrames?
index = pd.MultiIndex.from_tuples((), names=[ "i1", "i2" ] )
df = pd.DataFrame( index = index, columns = [ "c1", "c2" ] )
df
c1 c2
i1 i2
В результате получается пустой фрейм данных с 2-уровневым мультииндексом (i1, i2) и 2 столбцами (c1, c2), как показано выше. Теперь вставьте первую строку в этот фрейм данных:
df.loc[ ( "x", "y" ) ] = 1
df
c1 c2 y
i1 i2
x NaN NaN 1.0
Этого результата я не ожидал. Он вставляет новую строку (правильно) с новым столбцом с именем "y" (на мой взгляд, неверно), используя значение, которое должно было быть вставлено в индекс i2, и не присваивая значения i2, c1 и c2.
Сравните это с аналогичным случаем 1-уровневого MultiIndex:
index = pd.MultiIndex.from_tuples((), names=[ "i1" ] )
df = pd.DataFrame( index = index, columns = [ "c1", "c2" ] )
df
c1 c2
i1
df.loc[ "x" ] = 1, 2
df
c1 c2
i1
x 1 2
Здесь мы находим новую строку «x» со значением индекса в индексе, значениями данных в столбцах и без добавления дополнительного столбца.
Или с еще более подходящим случаем 3-уровневого MultiIndex:
index = pd.MultiIndex.from_tuples((), names=[ "i1", "i2", "i3" ] )
df = pd.DataFrame( index = index, columns = [ "c1", "c2" ] )
df
c1 c2
i1 i2 i3
df.loc[ ("x", "y", "z") ] = 1, 2
df
c1 c2
i1 i2 i3
x y z 1 2
Также в этом случае вставка новой строки ("x", "y", "z") со значениями индекса в индексе, значениями данных в столбцах и без добавления дополнительного столбца.
Так почему такое девиантное поведение в случае 2-уровневого MultiIndex DataFrame? Обратите внимание, что я обнаружил то же поведение при добавлении строки с использованием pd.concat вместо df.loc.
Обратите внимание также, что только для двухуровневого MultiIndex DataFrame оператор:
df.loc[ ( "x", "y" ) ] = 1, 2
генерирует ошибку ValueError: «невозможно установить, используя индексатор выбора с несколькими индексами, длина которого отличается от значения».
Использование Python 3.6 (x64) и Pandas 0.20.3.