python - 使用多个多索引级别删除

标签 python pandas

我有一个像这样的多索引数据框:

      foo
c b a
p 6 1 3.0
q 7 2 2.3
r 8 3 1.0
s 9 4 100.0

我可以使用drop使用前 n MultiIndex 级别删除多行,如下所示:

>>> x.drop([('p', 6), ('r',8)])
      foo
c b a
q 7 2 2.3
s 9 4 100.0

我也可以drop从单一层面来看:

>>> x.drop([1, 2], level='a')
      foo
c b a
r 8 3 1.0
s 9 4 100.0

但我似乎无法对多个级别执行此操作(除了第一个 n):

>>> x.drop([(8, 3), (9, 4)], level=['b', 'a'])
Traceback (most recent call last):

  File "<ipython-input-156-a650ded10561>", line 1, in <module>
    x.drop([(8, 3), (9, 4)], level=['b', 'a'])

  File "/usr/lib/python2.7/dist-packages/pandas/core/generic.py", line 1399, in drop
    new_axis = axis.drop(labels, level=level)

  File "/usr/lib/python2.7/dist-packages/pandas/core/index.py", line 2718, in drop
    return self._drop_from_level(labels, level)

  File "/usr/lib/python2.7/dist-packages/pandas/core/index.py", line 2744, in _drop_from_level
    i = self._get_level_number(level)

  File "/usr/lib/python2.7/dist-packages/pandas/core/index.py", line 2199, in _get_level_number
    raise KeyError('Level %s not found' % str(level))

KeyError: "Level ['b', 'a'] not found"

这看起来很奇怪,因为 xs 确实接受级别列表,如示例所示:

>>> df.xs(('baz', 2), level=[0, 'third'])
        A  B  C  D
second
three   5  3  5  3

那么如何从数据框中删除 [(8, 3), (9, 4)] (即第三行和第四行)?

最佳答案

目前还没有此功能,请参阅此问题:https://github.com/pydata/pandas/pull/6599

但是您可以这样做。

In [19]: mask = df.index.get_level_values

In [20]: df.loc[~(mask('b').isin([8,9]) & mask('a').isin([3,4]))]
Out[20]: 
       foo
c b a     
p 6 1  3.0
q 7 2  2.3

关于python - 使用多个多索引级别删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25017963/

相关文章:

python - 我想迭代字典中的多个数组列表并打印每个键和值

python - 使用一个数据帧输出查找另一个数据帧中的匹配行

python - Pandas 日期时间: groupy hourly and every monday

python - 自定义 matplotlib 图 : chess board like table with colored cells

python - Matplotlib Python

python - 在转换中访问 DataFrame 的不同列

python - 从具有 NA 值的 Date 获取 Year & Month 作为字符串

python - 如何从多个数据框列中制作单独的列表?

python - Pandas 提取多字符正则表达式

pandas - 在 Pandas 行中创建元素