Вставка строки в Pandas DataFrame с двухключевым Multi-Index не удалась - PullRequest
0 голосов
/ 30 июня 2018

Пожалуйста, ознакомьтесь со следующими простыми сценариями и дайте мне знать, если я делаю что-то не так, или, возможно, это ошибка в 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.

1 Ответ

0 голосов
/ 30 июня 2018

Вы близки, нужно : для выбора всех столбцов:

df.loc[ ( "x", "y" ), :] = 1
print (df)
       c1  c2
i1 i2        
x  y    1   1

df.loc[ ( "x", "y" ), :] = 1,2
print (df)
       c1  c2
i1 i2        
x  y    1   2
...