2012-08-30 23 views
62

मैं पांडों के साथ एक काफी बड़ी सीएसवी फ़ाइल पढ़ने की कोशिश कर रहा हूं और इसे दो यादृच्छिक हिस्सों में विभाजित कर रहा हूं, जिनमें से एक डेटा का 10% और दूसरा 90% है।पांडा: डेटाफ्रेम का नमूनाकरण

rows = data.index 
row_count = len(rows) 
random.shuffle(list(rows)) 

data.reindex(rows) 

training_data = data[row_count // 10:] 
testing_data = data[:row_count // 10] 

किसी कारण से, sklearn इस त्रुटि फेंकता है जब मैं एक SVM वर्गीकारक के अंदर इन जिसके परिणामस्वरूप DataFrame वस्तुओं में से एक का उपयोग करने का प्रयास करें:

IndexError: each subindex must be either a slice, an integer, Ellipsis, or newaxis 

मुझे लगता है कि

यहाँ मेरे वर्तमान प्रयास है मैं यह गलत कर रहा हूँ। क्या ऐसा करने के लिए इससे अच्छा तरीका है?

+3

संयोग से, इस बेतरतीब ढंग से सही ढंग से वैसे भी शफ़ल नहीं होता - समस्या 'random.shuffle (सूची (पंक्तियाँ))' है । 'shuffle' उस डेटा को बदलता है जिस पर यह चल रहा है, लेकिन जब आप' सूची (पंक्तियां) 'कहते हैं, तो आप' पंक्तियों 'की एक प्रति बनाते हैं जो बदल जाती है और फिर फेंक दी जाती है - अंतर्निहित पांडा श्रृंखला,' पंक्तियां 'अपरिवर्तित होती है। एक समाधान 'पंक्तियों = सूची (पंक्तियों)', फिर 'random.shuffle (पंक्तियां) 'और' data.reindex (पंक्तियां)' को कॉल करना है। –

उत्तर

76

आप पांडा का किस संस्करण का उपयोग कर रहे हैं? मेरे लिए आपका कोड ठीक काम करता है (मैं गिट मास्टर पर हूं)।

एक और दृष्टिकोण हो सकता है:

In [117]: import pandas 

In [118]: import random 

In [119]: df = pandas.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) 

In [120]: rows = random.sample(df.index, 10) 

In [121]: df_10 = df.ix[rows] 

In [122]: df_90 = df.drop(rows) 

नया संस्करण (0.16.1 पर से) यह सीधे समर्थन करता है: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sample.html

+7

एक अन्य दृष्टिकोण 'np.random.permuation' –

+1

@WesMcKinney का उपयोग करना है: मुझे लगता है कि 'np.random.permutation' डेटाफ्रेम से कॉलम नामों को पट्टी कर देगा, क्योंकि' np.random.permutation'। क्या पांडों में कोई तरीका है जो कॉलम नामों को बनाए रखते हुए डेटाफ्रेम को घुमाएगा? – hlin117

+4

@hlin df.loc [np.random.permutation (df.index)] डेटाफ्रेम को घुमाएगा और कॉलम नाम रखेगा। –

77

मैं ने पाया है कि np.random.choice() NumPy में नए 1.7.0 काम करता है बहुत अच्छी तरह से करने के लिए इस।

उदाहरण के लिए आप डेटाफ्रेम से इंडेक्स वैल्यू पास कर सकते हैं और 10 यादृच्छिक समान रूप से नमूने वाली पंक्तियों का चयन करने के लिए पूर्णांक 10 को पास कर सकते हैं।

rows = np.random.choice(df.index.values, 10) 
sampled_df = df.ix[rows] 
+0

की अनुशंसा करते हुए यह 'random.sample' समय का आधा लेता है .. np.random.choice के उपयोग के लिए भयानक – gc5

+0

+1। साथ ही, यदि आपके पास संभावनाओं की 'pd.Series' है,' prob', तो आप इंडेक्स से भी चुन सकते हैं: 'np.random.choice (prob.index.values, p = prob.values)' – LondonRob

+37

डॉन ' अगर आप प्रतिस्थापन के बिना नमूना चाहते हैं तो प्रतिस्थापन = गलत निर्दिष्ट करना भूल जाते हैं।अन्यथा यह विधि संभावित रूप से एक ही पंक्ति को कई बार नमूना दे सकती है। –

6

आप उपयोग कर रहे हैं pandas.read_csv आप सीधे स्वाद ले सकते हैं जब डेटा लोड हो रहा, skiprows पैरामीटर का उपयोग करके। यहां एक संक्षिप्त लेख है जिसे मैंने लिखा है - https://nikolaygrozev.wordpress.com/2015/06/16/fast-and-simple-sampling-in-pandas-when-loading-data-from-files/

+0

itertools.islice – Merlin

+0

पर यह प्रश्न का सही उत्तर है। – redreamality

13

पांडा 0.16.1 के लिए sample विधि है।

+0

अच्छा! लेकिन आपको अभी भी स्मृति में सभी डेटा लोड करना होगा, है ना? – Nikolay

+0

मैं स्मृति में डेटा लोड करने के बाद ऐसा करता हूं। – hurrial

17

नया संस्करण 0.16.1 में:

sample_dataframe = your_dataframe.sample(n=how_many_rows_you_want) 

डॉक यहाँ: http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.sample.html

+0

एक बार जब आप अपना sample_dataframe प्राप्त कर लेंगे, तो आप इसे अपने_डेटा फ्रेम से कैसे घटा सकते हैं? –

+0

@ChrisNielsen क्या आप पूछ रहे हैं ताकि आप पार सत्यापन कर सकें? यदि ऐसा है, तो मैं http://scikit-learn.org/stable/modules/cross_validation.html की अनुशंसा करता हूं क्योंकि यह आपको अपने सभी प्रशिक्षण और परीक्षण डेटासेट (X_train, X_test, y_train, y_test) सीधे देता है – dval

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