MultiIndex / 高级索引,其中级别不是(!=)值

Posted

技术标签:

【中文标题】MultiIndex / 高级索引,其中级别不是(!=)值【英文标题】:MultiIndex / Advanced Indexing where a level is not (!=) a value 【发布时间】:2016-11-28 04:52:04 【问题描述】:

你如何分割以下 df 使得第二级 != 二。

在我的实际情况中,我的第二级是日期范围,我希望能够选择除一个日期之外的所有内容。

来自MultiIndex / Advanced Indexing

In [1]: arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
                 ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
In [2]: tuples = list(zip(*arrays))
In [4]: index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
In [16]: df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)
In [38]: df = df.T

In [65]: df
Out[65]: 
                     A         B         C
first second                              
bar   one     0.895717  0.410835 -1.413681
      two     0.805244  0.813850  1.607920
baz   one    -1.206412  0.132003  1.024180
      two     2.565646 -0.827317  0.569605
foo   one     1.431256 -0.076467  0.875906
      two     1.340309 -1.187678 -2.211372
qux   one    -1.170299  1.130127  0.974466
      two    -0.226169 -1.436737 -2.006747

In [66]: df.xs('one', level='second')
Out[66]: 
              A         B         C
first                              
bar    0.895717  0.410835 -1.413681
baz   -1.206412  0.132003  1.024180
foo    1.431256 -0.076467  0.875906
qux   -1.170299  1.130127  0.974466

我很惊讶@pandas.pydata.org 的文档如此糟糕。没有任何示例的解释。就像文档是由专家为已经熟悉 pandas 的所有功能的人编写的一样。

为什么文档没有提供代码来重新生成示例?

【问题讨论】:

如果您在没有受过教育/学习基础知识的情况下使用 pandas 的高级功能,您会发现文档难以阅读。文档是渐进的。他们不会重复基础知识。 你能给我指出一个好的资源/教程来学习基础知识吗?我一直在浏览各种资源,例如 Wes.M 和其他人的 Youtube 研讨会以及文档。但是,我还没有找到一个真正好的来源来学习一个坚实的基础。 people.duke.edu/~ccc14/sta-663/UsingPandas.html 我真的很喜欢这里的工作,节奏快。击中关键亮点 【参考方案1】:

从这里开始:

                    A         B         C
first second                              
bar   one    -0.350640 -1.761671  0.253923
      two    -0.036557  0.212322  0.537106
baz   one    -1.597584 -0.301356 -0.634428
      two     2.340900 -0.356272 -0.985386
foo   one     0.122753 -0.333827 -0.620175
      two     0.423211 -0.570563 -1.245026
qux   one    -0.972814 -0.878836 -1.030892
      two     0.312855 -0.191677  0.700006


df.iloc[df.index.get_level_values('second') != 'one' ]

                    A         B         C
first second                              
bar   two    -0.036557  0.212322  0.537106
baz   two     2.340900 -0.356272 -0.985386
foo   two     0.423211 -0.570563 -1.245026
qux   two     0.312855 -0.191677  0.700006


df.iloc[df.index.get_level_values('second') != 'two' ]
                     A         B         C
first second                              
bar   one    -0.350640 -1.761671  0.253923
baz   one    -1.597584 -0.301356 -0.634428
foo   one     0.122753 -0.333827 -0.620175
qux   one    -0.972814 -0.878836 -1.030892

【讨论】:

以上是关于MultiIndex / 高级索引,其中级别不是(!=)值的主要内容,如果未能解决你的问题,请参考以下文章

重新索引 MultiIndex 数据帧的特定级别

选择 Pandas DataFrame 的第二个 MultiIndex 级别作为索引器

带有 pandas groupby multiindex 的箱线图,用于来自 multiindex 的指定子级别

部分级别上的 pandas MultiIndex 交集

无法访问具有级别名称的 MultiIndex DataFrame

Pandas Multiindex 系列级别重新索引