2016-01-20 28 views
6

से सैम्पलिंग मैं एक MultiIndex पांडा DataFramedf_data कहा जाता है में निम्नलिखित पैनल डेटा के साथ काम कर रहा हूँ:MultiIndex DataFrame

   y   x 
n time      
0 0  0.423607 -0.307983 
    1  0.565563 -0.333430 
    2  0.735979 -0.453137 
    3  0.962857 1.671106 
1 0  0.772304 1.221366 
    1  0.455327 -1.024852 
    2  0.864768 0.609867 
    3  0.334429 -2.567936 
2 0  0.435553 -0.259228 
    1  0.221501 0.484677 
    2  0.773628 0.650288 
    3  0.293902 0.566452 

n अनुक्रमित एक व्यक्ति, t अनुक्रमित समय (उनमें से 500 कर रहे हैं)। यह एक संतुलित पैनल है। मैं प्रतिस्थापन वाले nn=100 व्यक्तियों का एक यादृच्छिक नमूना बनाना चाहता हूं। साथ ही, यदि कोई व्यक्ति इसे यादृच्छिक नमूना में बनाता है, तो इस व्यक्ति के लिए सभी 4 बार अवलोकन (टी = 0,1,2,3) नमूना को असाइन किया जाना चाहिए।

निम्न पंक्ति लगभग कर रही है जो मैं चाहता:

df_sample = df_data.loc[np.random.randint(3, size=100).tolist()] 

हालांकि, यह एक व्यक्ति बार-बार नमूना नहीं है। तो यदि यादृच्छिक चर की बनाई गई सूची कहती है [2, 3, 2, 4, 1, ...] तो तीसरा व्यक्ति (अनुक्रमणिका = 2 तीसरा व्यक्ति है) केवल एक बार चयनित होता है और यादृच्छिक नमूना में दो बार नहीं होता है। इसका अर्थ यह है कि जैसे ही यादृच्छिक वेक्टर में एक ही व्यक्ति एक से अधिक बार होता है, मैं यादृच्छिक नमूने में 100 से कम व्यक्तियों (प्रत्येक के साथ 4 बार अवलोकन) के साथ समाप्त होता हूं। मैंने df_data.sample फ़ंक्शन का भी प्रयास किया, लेकिन मुझे पैनल में मौजूद विशिष्ट बहुस्तरीय इंडेक्स को संभालने में सक्षम नहीं लगता है। मैं यह करने के लिए सभी प्रकार के लूप लिख सकता था, लेकिन मैंने सोचा कि ऐसा करने का एक सरल (और तेज़) तरीका होना चाहिए। मैं पाइथन 3.5 पर हूं और मैं पांडा संस्करण 0.17.1 का उपयोग कर रहा हूं। धन्यवाद।

+0

संभावित डुप्लिकेट पांडा मल्टीइंडेक्स] (http://stackoverflow.com/questions/38731858/how-to-get-a-random-bootstrap-sample-from-pandas-multiindex) – maxymoo

उत्तर

1

आप itertools.product का उपयोग जल्दी से प्रारूप की जरूरत का उत्पादन कर सकते हैं एक MultiIndex से डुप्लिकेट के साथ चयन करने के लिए:

नमूना डेटा:

from itertools import product 
individuals = list(range(500)) 
time = (0, 1, 2, 3,) 
index = pd.MultiIndex.from_tuples(list(product(individuals, time))) 
df = pd.DataFrame(data={'A': np.random.random(size=2000), 'B': np.random.random(size=2000)}, index=index) 

       A   B 
0 0 0.208461 0.842118 
    1 0.481681 0.096121 
    2 0.420538 0.922363 
    3 0.859182 0.078940 
1 0 0.171162 0.255883 
    1 0.338864 0.975492 
    2 0.270533 0.504605 
    3 0.691041 0.709189 
2 0 0.220405 0.925001 
    1 0.811951 0.479795 
    2 0.010527 0.534866 
    3 0.561204 0.915972 
3 0 0.813726 0.083478 
    1 0.745100 0.462120 
    2 0.189111 0.552039 
    3 0.006141 0.622969 

product का उपयोग कर time मूल्यों के साथ np.random.randint का परिणाम संयुक्त करें:

sample_ix = np.random.randint(low=0, high=500, size=100) 

len(np.unique(sample_ix)) 

91 

sample_multi_ix = list(product(sample_ix, time)) 

[(55, 0), (55, 1), (55, 2), (55, 3), (254, 0), (254, 1), (254, 2), (254, 3), ...] 

और तदनुसार चुनें:

sample = df.loc[sample_multi_ix, :] 
sample.info() 

MultiIndex: 400 entries, (55, 0) to (135, 3) 
Data columns (total 2 columns): 
A 400 non-null float64 
B 400 non-null float64 
dtypes: float64(2) 
memory usage: 9.4+ KB 

आप एक अद्वितीय sampleindex चाहते हैं, आप जोड़ सकते हैं:

sample.index = pd.MultiIndex.from_tuples(list(product(list(range(100)), time))) 

MultiIndex: 400 entries, (0, 0) to (99, 3) 
Data columns (total 2 columns): 
A 400 non-null float64 
B 400 non-null float64 
dtypes: float64(2) 
+0

हाय स्टीफन, यह एक अच्छा समाधान है और लगभग 30 गुना तेज है वें जो मैंने कल रात पकाया था। आपके समाधान में जोड़ने के लिए एक चीज नमूना को फिर से बदलना होगा, ताकि इंडेक्स फिर से अनूठे हों और कुछ पांडा कार्यों को चलाया जा सके (जैसे OLS, आदि)। कुछ ऐसा: 'व्यक्तियों = सूची (रेंज (100))' और 'indexb = pd.MultiIndex.from_tuples (सूची (उत्पाद (व्यक्तियों, समय))) 'और' नमूना = sample.set_index (indexb) ' –

+0

आपका स्वागत है, 'मल्टी इंडेक्स' में डुप्लिकेट से छुटकारा पाने के लिए अपडेट किया गया। – Stefan

+0

बिल्कुल सही। धन्यवाद। –

0

एक सरल समाधान:

subindex = df.index.get_level_values('sub_index') 
sample_ids = np.random.choice(subindex, 5, replace=True) 
sample = df[subindex.isin(sample_ids)].copy() 
[कैसे एक यादृच्छिक (बूटस्ट्रैप) प्राप्त करने के लिए से नमूने के
संबंधित मुद्दे