Как обновить записи в мультииндексном фрейме данных с одним индексным - PullRequest
0 голосов
/ 08 июня 2019

Мне нужно обновить многоиндексный фрейм данных с одноиндексным.Новый фрейм данных является подмножеством старого, просто с новыми значениями, поэтому создание нового столбца или строки не требуется.Обновляются только выбранные фрагменты, и это должно поддерживать обновление более одного столбца одновременно.Я бы хотел, чтобы панды выполняли автоматический разбор индекса строки и перезаписывали только предоставленные строки.

Можно ли это сделать в API-интерфейсе pandas 0.24.2 без циклов, пользовательских функций, сброса индекса илисоздание мультииндекса?(Какой смысл иметь мультииндекс, если вы не можете нарезать и обновлять?) Я перебирал другие вопросы и не нашел актуального ответа, который применим к этому конкретному варианту использования или предлагает элегантное решение.

Вот некоторый код.

df_old = pd.DataFrame(
    [['a', 'x', 0, 0, 0], ['a', 'y', 0, 0, 0], ['a', 'z', 0, 0, 0],
     ['b', 'x', 0, 0, 0], ['b', 'y', 0, 0, 0], ['b', 'z', 0, 0, 0],
    ],
    columns=['i1', 'i2', 'c1', 'c2', 'c3']).set_index(['i1', 'i2'])

df_new = pd.DataFrame([['x', 1, 2], ['y', 3, 4]],
                      columns=['i2', 'c1', 'c2']).set_index('i2')

df_old 
Out[]:
       c1  c2  c3
i1 i2            
a  x    0   0   0
   y    0   0   0
   z    0   0   0
b  x    0   0   0
   y    0   0   0
   z    0   0   0

df_new
Out[]: 
    c1  c2
i2        
x    1   2
y    3   4

В идеале мне бы хотелось, чтобы работала следующая однострочная команда, но она абсолютно ничего не делает.Даже не выдается ни одного предупреждения.Я также попытался объединить и присоединиться безрезультатно.

df_old.loc[idx['a'], :].update(df_new)

Ожидаемый результат выглядит следующим образом, где обновляется только выбранный срез "a".

       c1  c2  c3
i1 i2            
a  x    1   2   0
   y    3   4   0
   z    0   0   0
b  x    0   0   0
   y    0   0   0
   z    0   0   0

Сводка данных в одной четкой картинке

Спасибо!

1 Ответ

0 голосов
/ 08 июня 2019

Это решение работает для меня, если (1) каждый индекс в df_new имеет соответствующий индекс в df_old;(2) порядок индексов i2 одинаков в df_old и df_new.Второе ограничение необходимо, потому что порядок элементов левого среза соответствует порядку в df_old, а не df_new.index.Я не уверен, является ли это ошибкой или предполагаемым поведением.

df_old.loc[('a', df_new.index), df_new.columns] = df_new.values

Более подробную информацию о нарезке MultiIndex можно найти здесь .

...