Python 一个人如何使用;takeable=True";和dataframe.set_值中的索引器,尤其是使用多索引时

Python 一个人如何使用;takeable=True";和dataframe.set_值中的索引器,尤其是使用多索引时,python,pandas,Python,Pandas,pandas.DataFrame.set_value的文档描述了参数takeable,因此:takeable:“将索引/列解释为索引器,默认为False” 我当前的具体目标是在set_值中输入一些相当广泛的索引和列列表,以将特定区域全部设置为特定值(理想情况下,在不存在列的任何位置扩展数据帧)。我还使用了多索引,所以我觉得我需要很好地理解这里“索引器”的确切含义。我查看了源代码,但在本例中,我应该将什么输入到col和index值中似乎并不是不言而喻的 例如: df.set_value((":",

pandas.DataFrame.set_value的文档描述了参数takeable,因此:takeable:“将索引/列解释为索引器,默认为False”

我当前的具体目标是在set_值中输入一些相当广泛的索引和列列表,以将特定区域全部设置为特定值(理想情况下,在不存在列的任何位置扩展数据帧)。我还使用了多索引,所以我觉得我需要很好地理解这里“索引器”的确切含义。我查看了源代码,但在本例中,我应该将什么输入到col和index值中似乎并不是不言而喻的

例如:

df.set_value((":",":"),(":",":"),0,takeable=True)
抛出有关有效索引的错误(如果删除引号,则在添加它们之前会出现语法错误)

我真正想做的是:

df.set_value(complicated_indexer,complicated_column_indexer,0,takeable=True)
在这里,我提前设置了这些索引器,可能指向许多不同的列/索引行

这不是词组将index/col解释为索引器的意思吗?或者有一些.loc或pd.indexlice的安排,可以生成任意索引器以输入set_值,这将非常酷


在任何情况下,了解什么可以进入索引/列并被解释为索引器都是很好的。

似乎
设置值
可能是一种遗留方法?我认为你所说的方法是:

df.loc[complicated_indexer, complicated_column] = 0
df.iloc[complicated_indexer, complicated_column] = 0

取决于您的索引器是位置(
iloc
)还是标签(
loc
)。

好的,所以经过一段代码挖掘和实验后,“takeable=True”选项寻找的索引器需要是numpy样式的位置标记(例如整数、省略号、冒号或布尔或int数组)。所以,我的主要问题是试图使用标签。但它不能解决我的问题,因为它不进行扩展(添加行或列)。为了让其他人知道这些“可采用”索引是什么,这里有一个示例,包括它如何与多个索引交互

首先让我们制作一个多索引数据帧:

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
         np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
df
        0   1   2   3
bar one 0.0 0.0 0.0 0.0
bar two 0.0 0.0 0.0 0.0
baz one 0.0 0.0 0.0 0.0
baz two 0.0 0.0 0.0 0.0
foo one 0.0 0.0 0.0 0.0
foo two 0.0 0.0 0.0 0.0
qux one 0.0 0.0 0.0 0.0
qux two 0.0 0.0 0.0 0.0
我们可以很容易地通过标签将一些设置为5:

 df.set_value((['bar','foo'],['one','two']),3,5)
    df
            0   1   2   3
bar one 0.0 0.0 0.0 5.0
bar two 0.0 0.0 0.0 5.0
baz one 0.0 0.0 0.0 0.0
baz two 0.0 0.0 0.0 0.0
foo one 0.0 0.0 0.0 5.0
foo two 0.0 0.0 0.0 5.0
qux one 0.0 0.0 0.0 0.0
qux two 0.0 0.0 0.0 0.0
使用takeable进行设置需要上述类型,因此这里我将提供整数索引值。takeables和multi index可能令人困惑的是,它们使用pandas用于multi index的内部编号(例如,排序前后可能不同)。弄清楚多索引和takable会发生什么变化变得相当复杂。在本例中,我使用了单个列并进行了很好的排序,因此,如果对列进行倒计时,结果会有些直观:

df.set_value([1,2,3],2,-1,takeable=True)
df
        0   1   2   3
bar one 0.0 0.0 0.0 5.0
bar two 0.0 0.0 -1.0    5.0
baz one 0.0 0.0 -1.0    0.0
baz two 0.0 0.0 -1.0    0.0
foo one 0.0 0.0 0.0 5.0
foo two 0.0 0.0 0.0 5.0
qux one 0.0 0.0 0.0 0.0
qux two 0.0 0.0 0.0 0.0
然而,无论是标签还是“可采取的”方法集似乎都没有在这个级别上进行扩展。所以看起来我需要用老式的方式设置我的新专栏:)


作为助记符,我现在想到了“takeable”,意思是你在传递一个索引引用,这个引用可以一直“taked”到numpy输入括号:)

好吧,我先尝试了一下,但无法在扩展的多索引中设置复杂的区域,你的印象应该有效吗?从我所读到的内容来看,关键在于找到如何将我试图使用的正确掩码传递到pandas/numpy核心的迭代器中。如果没有其他人有其他建议,我会在早上尝试更多关于.loc的内容。如果你能举例说明你所说的复杂索引器是什么意思,或者你想实现什么,这会有所帮助。许多多索引查询都可以通过“是的,你当然是对的”来表示。很抱歉,我在一个家庭之夜离开了电脑——我想我是在想我错过了一些明显的东西,有人会告诉我如何使用索引器。我会在早上炮制一个最低可行的例子,如果没有魔法发生,我再次道歉。没问题!老实说,我想我以前没见过
设置值。当我在一个清新的早晨开始做一个最小的例子时,我就开始做实验,深入研究熊猫代码,找出什么是可接受的方法,以及为什么它不能进行扩展,见上文。使用.loc在扩展时也会失败,请在我上面给出的矩阵上尝试df.loc[idx[['bar','foo'],['one','two','three']],idx[2]=4,它不会在“bar”和“foo”中添加行'three'。我有一个非常复杂的场景,希望能找到一些自动行-列添加的东西(set_value对单值插入有帮助!)