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
相似的
- 请注意,这与本文介绍的
切片的情况不同,这些切片已经在多索引
多索引
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,它没有填充值。但是我不知道为什么分两步做会有很大的问题?