2015-03-18 45 views
12

我有一个pandas数据帧,dfSlice熊猫数据框按标签不在列表中

我想选择df所有指数是在列表中没有blacklist.

现在,我使用列表解析创建所需的标签切片。

ix=[i for i in df.index if i not in blacklist] 
df_select=df.loc[ix] 

工作正常,但如果我经常需要这样做可能很笨拙。

有没有更好的方法来做到这一点?

回答

21

对指数使用isin和反转布尔指数进行标签的选择:

In [239]: 

df = pd.DataFrame({'a':np.random.randn(5)}) 
df 
Out[239]: 
      a 
0 -0.548275 
1 -0.411741 
2 -1.187369 
3 1.028967 
4 -2.755030 
In [240]: 

t = [2,4] 
df.loc[~df.index.isin(t)] 
Out[240]: 
      a 
0 -0.548275 
1 -0.411741 
3 1.028967 
+1

我测试了速度与使用集合(以及多索引列表)的替代方法。这种方法快两倍。我还可以确认它适用于MultiIndex – 2017-04-13 15:18:14

+0

另一种观察:我使用@Hagrid67示例,发现索引“在列表中”和“不在列表中”之间的速度没有实际差别 – 2017-04-13 15:23:11

0
import pandas as pd 
df = pd.DataFrame(data=[5,6,7,8], index=[1,2,3,4], columns=['D',]) 
blacklist = [2,3] 
#your current way ... 
ix=[i for i in df.index if i not in blacklist] 
df_select=df.loc[ix] 

# use a mask 
mask = [True if x else False for x in df.index if x not in blacklist] 
df.loc[mask] 

http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-label 实际上,在上述和ILOC都采取一个布尔阵列,在这种情况下,mask。从现在开始,你可以重复使用这个面具,应该更有效率。

5

你可以使用set()来制作自己的原创指数和那些要删除的区别:

df.loc[set(df.index) - set(blacklist)] 

它拥有的是简约的,以及更易于优势比列表理解阅读。

+0

感谢,这种做法是很好的。 – lmart999 2015-03-19 18:49:41

0

感谢ASGM;我发现,我需要把设定成一个列表,使其与一个多指标的工作:

mi1 = pd.MultiIndex.from_tuples([("a", 1), ("a", 2), ("b", 1), ("b", 2)]) 
df1 = pd.DataFrame(data={"aaa":[1,2,3,4]}, index=mi1) 
setValid = set(df1.index) - set([("a", 2)]) 
df1.loc[list(setValid)] # works 
df1.loc[setValid] # fails 

(抱歉,无法发表评论,代表不足)