2015-03-18 15 views
12

pandas veri çerçevem ​​var, df.Dilim Pandaları veri çerçevesi listede olmayan etiketlere göre

ben dilimlemek istenen etiketleri oluşturmak için liste anlama kullanın liste halinde değil, Şimdi blacklist.

olduğunu df tüm indeksleri seçmek istiyorum.

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

İyi çalışıyor, ancak sık sık yapmam gerekirse hantal olabilir.

Bunu yapmanın daha iyi bir yolu var mı?

cevap

21

Kullanım isin ve etiket seçimini gerçekleştirmek için boolean endeksi ters: ASGM için

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

Bunu test alternatifleri (ve çoklu indeksleme listeleri) alternatifine karşı test ettim. Bu yöntem ~ 2x daha hızlıdır. Ayrıca, MultiIndex –

+0

için çalıştığını da doğrulayabilirim Başka bir gözlem: @ Hagrid67 örneğini kullandım ve "listede" ve "listede olmayanlar arasında" dizinleme arasında gerçek bir fark bulunamadı. –

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 aslında, loc ve iLOC hem bu durumda mask yılında, bir boolean dizi alır. Bundan sonra bu maskeyi tekrar kullanabilirsiniz ve daha verimli olmalısınız.

5

Orijinal endeksleri ve kaldırmak istediğiniz olanlar arasındaki farkı yaratmak için set() kullanabilirsiniz:

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

Bir liste anlama daha okumak parsimonious olmak, hem de daha kolay olma avantajına sahiptir . endeksi

+0

sayesinde, bu yaklaşım güzel. – lmart999

0

sayesinde; Ben bir MultiIndex ile çalışması için bir liste haline setini açmak için gerekli bulundu:

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 

(üzgün, yetersiz temsilcisi yorum yapamam)

İlgili konular