2015-03-18 6 views
12

मेरे पास pandas डेटाफ्रेम, df है।स्लाइस पांडस डेटाफ्रेम जो लेबल में नहीं हैं

मुझे लगता है कि कर रहे हैं एक सूची में नहीं, blacklist.

अब df में सभी सूचकांकों का चयन करना चाहते हैं, मैं सूची समझ का उपयोग काट के लिए वांछित लेबल बनाने के लिए।

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

मैंने सेट का उपयोग करने के विकल्प (और बहु ​​अनुक्रमण के लिए सूचियों) के विकल्प के खिलाफ गति के लिए इसका परीक्षण किया। यह विधि ~ 2x तेज है। मैं यह भी पुष्टि कर सकता हूं कि यह मल्टीइंडेक्स –

+0

के लिए काम करता है एक और अवलोकन: मैंने @ हैग्रिड 67 उदाहरण का उपयोग किया और "सूची में" और "सूची में नहीं" अनुक्रमण के बीच गति में कोई वास्तविक अंतर नहीं पाया –

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 वास्तव में, loc और दोनों iloc इस मामले mask में एक बूलियन सरणी ले,। अब से आप इस मुखौटा का पुन: उपयोग कर सकते हैं और अधिक कुशल होना चाहिए।

5

आप set() इस्तेमाल कर सकते हैं अपने मूल सूचकांक और उन है कि आप निकालना चाहते हैं के बीच अंतर पैदा करने के लिए:

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

यह किफ़ायती किया जा रहा है, साथ ही आसान होने का लाभ एक सूची समझ से पढ़ने के लिए है । सूचकांक पर

+0

धन्यवाद, इस दृष्टिकोण अच्छा है। – lmart999

0

ASGM के लिए धन्यवाद; मैंने पाया कि मैं एक सूची में सेट चालू करने के लिए यह एक MultiIndex साथ काम करने के लिए की जरूरत:

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 

(खेद टिप्पणी नहीं कर सकता, अपर्याप्त प्रतिनिधि)

संबंधित मुद्दे