【问题标题】:How to add an index label using pandas MultiIndex.insert to an existing MultiIndex?如何使用 pandas MultiIndex.insert 将索引标签添加到现有的 MultiIndex?
【发布时间】:2020-05-20 09:47:57
【问题描述】:

使用下面的代码,我尝试插入一个新的行标签(两个名称级别),但根据打印输出,MultiIndex.insert() 似乎不起作用。用户 xyzjayne 提到 here“MultiIndex 是不可变的”。那么为什么会有MultiIndex.insert 和/或如何在以下情况下正确使用MultiIndex.insert 以获得所需的结果?

不是选项:

在 MultiIndexing 之前将 ('D', '9') 添加到 labels 元组列表。 这个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'])

【问题讨论】:

    标签: python python-3.x pandas multi-index


    【解决方案1】:

    从与 jezrael 的讨论中可以看出,.insert 似乎是草率的或在文档中缺少文本。

    我的替代方案也有效:

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

    并且在 pandas docs 0.25.0 中没有这样描述 here

    Here 在 0.19.0 它是,文本应该是:

    MultiIndex.insert(index, loc, item)

    因此错过了以前的“MultiIndex”作为“Index”。

    【讨论】:

      【解决方案2】:

      你可以分配回去,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'])
      

      【讨论】:

      • .. 我刚刚发现 # add row at position 6 row_labels = pd.MultiIndex.insert(row_labels, 6, ('D', '9')) 出来了...但在 docs pandas 0.19 中仍然提到了 MultiIndex (loc, items)。
      • @ZF007 - 我的意见 - 这个功能很少使用,所以可能有问题。显然是MultiIndex转换为元组列表或DataFrames,处理然后转换回Multiindex
      • 是的..确实是越野车。感谢您加入。它为我节省了一两个小时的麻烦。
      猜你喜欢
      • 2018-12-20
      • 2015-12-13
      • 2012-04-18
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多