排除pandas数据帧中索引行的最有效方法

dka*_*tan 4 python pandas

我对Python和pandas比较陌生,并且正在与(hierachical)索引进行斗争.我已经掌握了基础知识,但是因为更先进的切片和横截面而丢失了.

例如,使用以下数据帧

import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(9).reshape((3, 3)),
    index=pd.Index(['Ohio', 'Colorado', 'New York'], name='state'), columns=pd.Index(['one', 'two', 'three'], name='number'))
Run Code Online (Sandbox Code Playgroud)

我想选择除索引'Colorado'之外的所有内容.对于我可以做的小数据集:

data.ix[['Ohio','New York']]
Run Code Online (Sandbox Code Playgroud)

但是如果唯一索引值的数量很大,那就不切实际了.天真地,我希望有一种类似的语法

data.ix[['state' != 'Colorado']]
Run Code Online (Sandbox Code Playgroud)

但是,这只返回第一条记录"俄亥俄州"并且不返回"纽约".这有效,但很麻烦

filter = list(set(data.index.get_level_values(0).unique()) - set(['Colorado']))
data[filter]
Run Code Online (Sandbox Code Playgroud)

当然有更多Pythonic,冗长的方式这样做?

DSM*_*DSM 8

这是一个Python问题,而不是一个问题pandas:'state' != 'Colorado'是真的,所以pandas得到的是data.ix[[True]].

你可以做到

>>> data.loc[data.index != "Colorado"]
number    one  two  three
state                    
Ohio        0    1      2
New York    6    7      8

[2 rows x 3 columns]
Run Code Online (Sandbox Code Playgroud)

或使用DataFrame.query:

>>> data.query("state != 'New York'")
number    one  two  three
state                    
Ohio        0    1      2
Colorado    3    4      5

[2 rows x 3 columns]
Run Code Online (Sandbox Code Playgroud)

如果你不喜欢重复data.(引用传递给.query()方法的表达式是围绕这样一个事实的唯一方法,否则Python会在pandas看到它之前评估比较.)