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

问题描述 投票:2回答:1

我的问题是这个主题的合理延续: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)

python pandas indexing
1个回答
2
投票

IIUC你想用pd.IndexSlice

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
© www.soinside.com 2019 - 2024. All rights reserved.