Python 无法将值分配给新的多索引切片(放大设置)

Python 无法将值分配给新的多索引切片(放大设置),python,pandas,indexing,multi-index,Python,Pandas,Indexing,Multi Index,给定我的数据框(如下),我可以单独创建不存在的新的多索引行 data.loc[('A', 6, 'test'), 'Data'] = 'a_value' 类似地,我可以修改已经存在于MultiIndex data.loc[pd.IndexSlice['A', 7:8, ('spam', 'eggs')], 'Data'] = 'a_value' 我无法做到以下几点 data.loc[pd.IndexSlice['A', (6, 7), ('eggs', 'spam')], 'Data']

给定我的数据框(如下),我可以单独创建不存在的新的
多索引

data.loc[('A', 6, 'test'), 'Data'] = 'a_value'
类似地,我可以修改已经存在于
MultiIndex

 data.loc[pd.IndexSlice['A', 7:8, ('spam', 'eggs')], 'Data'] = 'a_value'
我无法做到以下几点

data.loc[pd.IndexSlice['A', (6, 7), ('eggs', 'spam')], 'Data'] = 'a_value'
因为切片返回的数据帧是空的。除了逐个遍历所有不存在的索引之外,还有其他方法可以做到这一点吗

示例数据 可以通过复制下面的代码来生成测试数据帧

import pandas as pd
import numpy as np
data = pd.DataFrame(np.asarray([np.nan]*2+[np.random.random() for i in range(4)]+[np.nan]*2+[np.random.random(), np.random.random()]),index=pd.MultiIndex(levels=[[u'A', u'B'], [6, 7, 8, 9], [u'eggs', u'spam']], labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 1, 2, 2, 3, 3, 0, 1, 2, 3], [-1, -1, 0, 1, 0, 1, -1, -1, 1, 1]], names=[u'ID', u'ID2', u'ID3']),columns=['Data'])
# end snippet for easy copy/paste to ipython
相似的

  • 请注意,这与本文介绍的
    多索引
    切片的情况不同,这些切片已经在
    多索引

我只是在填写NAN,但如果您愿意,当然可以使用
fillna
。现有的dataframe已经有一些缺少的值,因此只给新行一个非NaN值会有点困难,但可以使用
update
,但我不完全清楚您在这里到底想做什么

data.reindex( pd.MultiIndex.from_product( data.index.levels ) )

              Data
A 6 eggs       NaN
    spam       NaN
  7 eggs       NaN
    spam       NaN
  8 eggs  0.938516
    spam  0.487062
  9 eggs  0.958066
    spam  0.786476
B 6 eggs       NaN
    spam       NaN
  7 eggs       NaN
    spam       NaN
  8 eggs       NaN
    spam  0.674202
  9 eggs       NaN
    spam  0.576285

嗯,这就是所谓的“放大设置”,但我不确定它是否适用于一般的切片,即使没有多重索引。文档中只说明它只在一个键上工作。不过,欢迎使用任何好的解决方法!嗯,我只是在这里戳一下。。。我对它的了解还不足以说明这是否可能,或者这是否是一个bug,我只知道它叫什么,呵呵。@JohnE我在英国,所以我睡着了!你的答案是目前最好的解决方案——你应该留下它。我非常喜欢使用
data.index.levels
multi-index.from_product
很抱歉,我取消了删除。主要问题是我不一定知道缺少索引的是6,7。我目前的退路与上述非常相似。迭代ID,然后使用get_index_值(“ID3”).unique()代替硬编码6,7。当然,你也可以补充说,我会投赞成票,选择一个最好的方法。如果有像熊猫一样更快的方法,想保持开放吗updates@AlexanderMcFarlane我不确定我是否理解,但看看我的更新altho,它没有填充值。但是我不知道为什么分两步做会有很大的问题?