如何使用" takeable = True"和dataframe.set_value中的索引器,尤其是多索引

时间:2015-09-02 00:03:56

标签: python pandas

pandas.DataFrame.set_value 的文档描述了可接受的参数:takeable:" 将索引/ col解释为索引器,默认为False &#34 ;

我当前的具体目标是将一些相当广泛的索引和列列表输入到set_value中,以将特定区域设置为特定值(理想情况下,在列不存在的任何位置扩展数据帧)。我也使用多索引,所以我觉得我需要很好地理解"索引器"这里。我查看了源代码,但在这种情况下,我不应该立即将其归入col和index值。

例如:

df.set_value((":",":"),(":",":"),0,takeable=True)

抛出有关有效索引的错误(如果删除引号,我会在添加之前得到语法错误。)

我真正想做的是:

df.set_value(complicated_indexer,complicated_column_indexer,0,takeable=True)

我提前设置这些索引器,可能指向许多不同的列/索引行。

这不是短语将索引/ col解释为索引器意味着或者是否存在.loc或pd.IndexSlice的某种排列,可以生成任意索引器以提供给set_value - 这将是非常的凉爽。

无论如何,了解可以将索引/ col作为索引器的内容将会很有用。

2 个答案:

答案 0 :(得分:1)

似乎set_value可能是某种遗留方法?我认为做你所说的方式是:

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

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

答案 1 :(得分:0)

好的,所以在经过一些代码挖掘和实验之后,似乎正在寻找的索引器是" takeable = True"选项需要是numpy风格的位置标记(例如整数,省略号,冒号或boolean或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进行设置需要上面的类型,所以这里我将提供INTEGER索引值。关于takeables和multi-index的可能令人困惑的事情是它们使用pandas用于多索引的内部编号(例如,在排序之前和之后可能不同)。要弄清楚多指数和可采取的变化会变得非常复杂。在这种情况下,我使用了一个列并进行了很好的排序,因此如果你倒数一下,结果会有些直观:

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

既不是标签也不是"可取的"但是,方法集似乎在此级别设置了扩展。所以看起来我需要以老式的方式设置我的新列:)

作为一种助记符,我现在想到了#34; takeable"意思是你传入的索引引用可以被"采取"一直到numpy输入括号:)