Как добавить метку индекса, используя pandas MultiIndex.insert к существующему MultiIndex? - PullRequest
0 голосов
/ 04 февраля 2020

С помощью приведенного ниже кода я попытался вставить новую метку строки (два уровня имени), но оказалось, что MultiIndex.insert() не работает в соответствии с выводом на печать. Пользователь xyzjayne упоминает здесь «MultiIndex является неизменным» . Тогда почему есть MultiIndex.insert и / или как правильно использовать MultiIndex.insert в приведенном ниже случае, чтобы получить желаемый результат?

НЕ опция:

добавьте ('D', '9') в список кортежей labels перед MultiIndexing. Этот labels является общим, имеет порядок списков по умолчанию и используется несколько раз в других местах в различных настройках. И, таким образом, до создания DataFrame.

Версии: pandas 0.25.1 py37ha925a31_0

Желаемый результат:

row_labels MultiIndex([('A', '1'),
                       ('A', '2'),
                       ('B', '3'),
                       ('B', '4'),
                       ('C', '5'),
                       ('C', '6'),
                       ('D', '9'),   # inserted row label ('D', '9')
                       ('D', '7'),
                       ('D', '8')],
                       names=['group', 'subgroup'])

Мой код:

import pandas as pd

labels = {'A' : ['1', '2'],
          'B' : ['3', '4'],
          'C' : ['5', '6'],
          'D' : ['7', '8']}

tpl = []

for g, sg in labels.items():
  for s in sg:
    tpl.append((g, s))

row_labels = pd.MultiIndex.from_tuples(tpl, names=['group', 'subgroup'])

print ('row_labels', row_labels)

i = row_labels.get_locs(('D',))

print ('\nD is found at row(s): ', i)

# add row at position 6
row_labels.insert(6, (('D', '9')))

# check for added label
print ('\nrow_labels', row_labels)

Мой токовый выход:

row_labels MultiIndex([('A', '1'),
                       ('A', '2'),
                       ('B', '3'),
                       ('B', '4'),
                       ('C', '5'),
                       ('C', '6'),
                       ('D', '7'),
                       ('D', '8')],
                       names=['group', 'subgroup'])

D is found at row(s):  [6 7]

row_labels MultiIndex([('A', '1'),
                       ('A', '2'),
                       ('B', '3'),
                       ('B', '4'),
                       ('C', '5'),
                       ('C', '6'),
                       ('D', '7'),
                       ('D', '8')],
                       names=['group', 'subgroup'])

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Можно назначить обратно, Index.insert не работает на месте:

print (pd.__version__)
0.25.1

# add row at position 6
row_labels = row_labels.insert(6, (('D', '9')))

# check for added label
print ('\nrow_labels', row_labels)
row_labels MultiIndex([('A', '1'),
            ('A', '2'),
            ('B', '3'),
            ('B', '4'),
            ('C', '5'),
            ('C', '6'),
            ('D', '9'),
            ('D', '7'),
            ('D', '8')],
           names=['group', 'subgroup'])
0 голосов
/ 04 февраля 2020

Как вы можете видеть из дискуссии с Джезраэль, .insert выглядит неаккуратно или отсутствует текст в документах.

Моя альтернатива также работает:

row_labels = pd.MultiIndex.insert(row_labels, 6, ('D', '9'))

И не так, как описано здесь в pandas документах 0,25,0.

Здесь в 0,19,0 это и текст должен быть :

MultiIndex.insert (index, lo c, item)

и, таким образом, отсутствует предыдущий "MultiIndex" в качестве "Index".

...