2013-02-01 37 views
6

मुझे एक पैनल में मास्किंग करने में कुछ परेशानी हो रही है, जिस तरह से मैं डेटाफ्रेम करता हूं। मैं जो करना चाहता हूं वह सरल लगता है, लेकिन मुझे दस्तावेज़ों और ऑनलाइन मंचों को देखने का कोई तरीका नहीं मिला है।पांडा पैनल में बूलियन मास्क

import pandas 
import numpy as np 
import datetime 
start_date = datetime.datetime(2009,3,1,6,29,59) 
r = pandas.date_range(start_date, periods=12) 
cols_1 = ['AAPL', 'AAPL', 'GOOG', 'GOOG', 'GS', 'GS'] 
cols_2 = ['close', 'rate', 'close', 'rate', 'close', 'rate'] 
dat = np.random.randn(12, 6) 

dftst = pandas.DataFrame(dat, columns=pandas.MultiIndex.from_arrays([cols_1, cols_2], names=['ticker','field']), index=r) 
pn = dftst.T.to_panel().transpose(2,0,1) 
print pn 

Out[14]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 2 (items) x 12 (major_axis) x 3 (minor_axis) 
Items axis: close to rate 
Major_axis axis: 2009-03-01 06:29:59 to 2009-03-12 06:29:59 
Minor_axis axis: AAPL to GS 

अब मैं एक पैनल वस्तु है, अगर मैं आइटम अक्ष के साथ एक टुकड़ा ले, मैं एक DataFrame

close_p = pn['close'] 
print close_p 

Out[16]: 
ticker     AAPL  GOOG  GS 
2009-03-01 06:29:59 -0.082203 -0.286354 1.227193 
2009-03-02 06:29:59 0.340005 -0.688933 -1.505137 
2009-03-03 06:29:59 -0.525567 0.321858 -0.035047 
2009-03-04 06:29:59 -0.123549 -0.841781 -0.616523 
2009-03-05 06:29:59 -0.407504 0.188372 1.311262 
2009-03-06 06:29:59 0.272883 0.817179 0.584664 
2009-03-07 06:29:59 -1.767227 1.168876 0.443096 
2009-03-08 06:29:59 -0.685501 -0.534373 -0.063906 
2009-03-09 06:29:59 0.851820 0.068740 0.566537 
2009-03-10 06:29:59 0.390678 -0.012422 -0.152375 
2009-03-11 06:29:59 -0.985585 -0.917705 -0.585091 
2009-03-12 06:29:59 0.067498 -0.764343 0.497270 

मैं दो तरीकों से इस डेटा फ़िल्टर कर सकते हैं मिलता है: मैं नीचे एक सरल उदाहरण है :

1) मैं इस प्रकार एक मुखौटा बना सकते हैं और डेटा मुखौटा:

msk = close_p > 0 
close_p = close_p.mask(msk) 

2) मैं सिर्फ बूलियन सेशन से काट कर सकते हैं ऊपर

close_p = close_p[close_p > 0] 
Out[28]: 
ticker     AAPL  GOOG  GS 
2009-03-01 06:29:59  NaN  NaN 1.227193 
2009-03-02 06:29:59 0.340005  NaN  NaN 
2009-03-03 06:29:59  NaN 0.321858  NaN 
2009-03-04 06:29:59  NaN  NaN  NaN 
2009-03-05 06:29:59  NaN 0.188372 1.311262 
2009-03-06 06:29:59 0.272883 0.817179 0.584664 
2009-03-07 06:29:59  NaN 1.168876 0.443096 
2009-03-08 06:29:59  NaN  NaN  NaN 
2009-03-09 06:29:59 0.851820 0.068740 0.566537 
2009-03-10 06:29:59 0.390678  NaN  NaN 
2009-03-11 06:29:59  NaN  NaN  NaN 
2009-03-12 06:29:59 0.067498  NaN 0.497270 

एमएसके में erator मुझे क्या करना कैसे को समझ नहीं सकता फिल्टर पाश के लिए एक के बिना अपने डेटा एक मुखौटा के आधार पर सभी को है। मैं निम्नलिखित कर सकता हूं:

msk = (pn['rate'] > 0) & (pn['close'] > 0) 
def mask_panel(pan, msk): 
    for item in pan.items: 
     pan[item] = pan[item].mask(msk) 
    return pan 
print pn['close'] 

Out[32]: 
ticker     AAPL  GOOG  GS 
2009-03-01 06:29:59 -0.082203 -0.286354 1.227193 
2009-03-02 06:29:59 0.340005 -0.688933 -1.505137 
2009-03-03 06:29:59 -0.525567 0.321858 -0.035047 
2009-03-04 06:29:59 -0.123549 -0.841781 -0.616523 
2009-03-05 06:29:59 -0.407504 0.188372 1.311262 
2009-03-06 06:29:59 0.272883 0.817179 0.584664 
2009-03-07 06:29:59 -1.767227 1.168876 0.443096 
2009-03-08 06:29:59 -0.685501 -0.534373 -0.063906 
2009-03-09 06:29:59 0.851820 0.068740 0.566537 
2009-03-10 06:29:59 0.390678 -0.012422 -0.152375 
2009-03-11 06:29:59 -0.985585 -0.917705 -0.585091 
2009-03-12 06:29:59 0.067498 -0.764343 0.497270 

mask_panel(pn, msk) 

print pn['close'] 

Out[34]: 
ticker     AAPL  GOOG  GS 
2009-03-01 06:29:59 -0.082203 -0.286354  NaN 
2009-03-02 06:29:59  NaN -0.688933 -1.505137 
2009-03-03 06:29:59 -0.525567  NaN -0.035047 
2009-03-04 06:29:59 -0.123549 -0.841781 -0.616523 
2009-03-05 06:29:59 -0.407504  NaN  NaN 
2009-03-06 06:29:59  NaN  NaN  NaN 
2009-03-07 06:29:59 -1.767227  NaN  NaN 
2009-03-08 06:29:59 -0.685501 -0.534373 -0.063906 
2009-03-09 06:29:59  NaN  NaN  NaN 
2009-03-10 06:29:59  NaN -0.012422 -0.152375 
2009-03-11 06:29:59 -0.985585 -0.917705 -0.585091 
2009-03-12 06:29:59  NaN -0.764343  NaN 

तो उपर्युक्त पाश चाल करता है। मुझे पता है कि ndarray का उपयोग करके ऐसा करने का एक तेज़ वेक्टरीकृत तरीका है, लेकिन मैंने अभी तक इसे एक साथ नहीं रखा है। ऐसा लगता है कि यह कार्यक्षमता होना चाहिए जो पांडा पुस्तकालय में बनाया गया है। यदि ऐसा करने का कोई तरीका है कि मुझे याद आ रही है, तो किसी भी सुझाव की सराहना की जाएगी।

+0

यह लगता है जैसे आप में सक्षम होना चाहिए बूलियन पैनल 'pn.gt (0)' का उपयोग करने के लिए ... –

+0

धन्यवाद एंडी, जब तक कि मैं गलत नहीं हूं, मुझे लगता है कि कुछ अलग होगा। यह मेरे पैनल में प्रत्येक डेटाफ्रेम को नकार देगा जहां इसके मान 0 से कम हैं। मैं अपने पैनल में प्रत्येक डेटाफ्रेम को नैन करना चाहता हूं, जहां 'बंद' 0 से कम है। फिर, मेरे पैनल में एक विशिष्ट डेटाफ्रेम बंद है । अगर मैं कुछ अच्छी तरह से आती हूं तो मैं झुकाव रखूंगा और पोस्ट करूंगा। – granders19

+0

क्या यह केवल निकट डेटाफ्रेम (पैनल का हिस्सा) को प्रभावित करेगा? क्या आप इसे पैनल में बदलना चाहते हैं और अन्य अपरिवर्तित छोड़ना चाहते हैं? –

उत्तर

9

मुझे लगता है कि यह काम करेगा (और क्या Panel.where इसकी एक सा गैर तुच्छ क्या करना चाहिए, लेकिन क्योंकि यह मामलों के एक झुंड को संभालने के लिए है)

# construct the mask in 2-d (a frame) 
In [36]: mask = (pn['close']>0) & (pn['rate']>0) 

In [37]: mask 
Out[37]: 
ticker    AAPL GOOG  GS 
2009-03-01 06:29:59 False False False 
2009-03-02 06:29:59 False False True 
.... 

# here's the key, this broadcasts, setting the values which 
# don't meet the condition to nan 
In [38]: masked_values = np.where(mask,pn.values,np.nan) 

# reconstruct the panel (the _construct_axes_dict is an internal function that returns 
# dict of the axes, e.g. items -> the items, major_axis -> ..... 
In [42]: x = pd.Panel(masked_values,**pn._construct_axes_dict()) 
Out[42]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 2 (items) x 12 (major_axis) x 3 (minor_axis) 
Items axis: close to rate 
Major_axis axis: 2009-03-01 06:29:59 to 2009-03-12 06:29:59 
Minor_axis axis: AAPL to GS 

# the values 
In [43]: x 
Out[43]: 
array([[[  nan,   nan,   nan], 
    [  nan,   nan, 0.09575723], 
    [  nan,   nan,   nan], 
    [  nan,   nan,   nan], 
    [  nan, 2.07229823, 0.04347515], 
    [  nan,   nan,   nan], 
    [  nan,   nan, 2.18342239], 
    [  nan,   nan, 1.73674381], 
    [  nan, 2.01173087,   nan], 
    [ 0.24109645, 0.94583072,   nan], 
    [ 0.36953467,   nan, 0.18044432], 
    [ 1.74164222, 1.02314752, 1.73736033]], 

    [[  nan,   nan,   nan], 
    [  nan,   nan, 0.06960387], 
    [  nan,   nan,   nan], 
    [  nan,   nan,   nan], 
    [  nan, 0.63202199, 0.56724391], 
    [  nan,   nan,   nan], 
    [  nan,   nan, 0.71964824], 
    [  nan,   nan, 1.03482927], 
    [  nan, 0.18256148,   nan], 
    [ 1.29451667, 0.49804327,   nan], 
    [ 2.04726538,   nan, 0.12883128], 
    [ 0.70647885, 0.7277734 , 0.77844475]]]) 
+0

धन्यवाद जेफ, यह बहुत अच्छा काम किया! यह लूप की तुलना में एक बेहतर समाधान है जिसके साथ मैं आया था। मैं मानता हूं कि यह अच्छा होगा अगर यह पैनलों के लिए .where विधि में बनाया गया था। – granders19

+0

कोई प्रोब नहीं - किसी बिंदु पर इसे प्राप्त होगा https://github.com/pydata/pandas/issues/2790 – Jeff

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

  • कोई संबंधित समस्या नहीं^_^