仅使用一级索引设置多索引数据框的值

时间:2017-12-26 00:17:46

标签: python pandas indexing

我的问题是这个主题的合理延续: Setting values with multiindex in pandas。所以这个例子和答案也适合我的情况。

他们使用f.loc[(slice(None), "one"), 0] = 1

设置了多索引值

但在我的情况下,我有很多数据框的自定义索引级别数,所以我想在最后一级使用索引,没有指定其他人 - 像f.loc[:::, "one"), 0] = 1一样。 附:另外,如果我有一个Indexer列"一个",我可以使用吗? 索引器可以是一个数组:array([ True, True, True, ..., True, True, True], dtype=bool)

1 个答案:

答案 0 :(得分:2)

您要使用pd.IndexSlice的IIUC:

In [276]: df
Out[276]:
                     0         1
first second
bar   one     0.414213 -0.316333
      two     1.109279  0.307283
baz   one    -0.287986 -1.963492
      two     0.858867  0.553895
foo   one    -0.152813 -2.489409
      two     1.022960  0.377656
qux   one     1.549389 -0.307250
      two    -1.150914 -3.517356

In [277]: df.loc[pd.IndexSlice[:,'one'], 0] = 1

In [278]: df
Out[278]:
                     0         1
first second
bar   one     1.000000 -0.316333
      two     1.109279  0.307283
baz   one     1.000000 -1.963492
      two     0.858867  0.553895
foo   one     1.000000 -2.489409
      two     1.022960  0.377656
qux   one     1.000000 -0.307250
      two    -1.150914 -3.517356

使用mask布尔索引:

In [291]: mask = (df[0] > 1).values

In [292]: mask
Out[292]: array([False,  True, False, False, False,  True, False, False], dtype=bool)

In [293]: df.loc[mask]
Out[293]:
                     0         1
first second
bar   two     1.109279  0.307283
foo   two     1.022960  0.377656

In [294]: df.iloc[mask]
Out[294]:
                     0         1
first second
bar   two     1.109279  0.307283
foo   two     1.022960  0.377656

In [295]: df[mask]
Out[295]:
                     0         1
first second
bar   two     1.109279  0.307283
foo   two     1.022960  0.377656