2013-04-22 13 views
9

मेरे पास कई वर्षों तक एक डेटाफ्रेम फैला हुआ है और किसी बिंदु पर उन्होंने जातीयता के लिए कोड बदल दिए हैं। तो मुझे साल में सशर्त मूल्यों को फिर से लोड करने की आवश्यकता है - जो एक ही डेटाफ्रेम में एक और कॉलम है। उदाहरण 1, 3 के लिए 2 से 3, 3 से 4 और इतने पर के लिए:पांडा में सशर्त प्रतिस्थापन

old = [1, 2, 3, 4, 5, 91] 
new = [3, 3, 4, 2, 1, 6] 

और यह केवल एक ही स्तंभ (जाति) में 1996 2001 के लिए अन्य वर्षों के लिए मूल्यों को साल के लिए किया जाता है चाहिए बदला नहीं जा सकता भी कई अक्षम छोरों से बचने के लिए आशा, मैंने कोशिश की:

recode_years = range(1996,2002) 
    for year in recode_years: 
     df['ethnicity'][df.year==year].replace(old, new, inplace=True) 

लेकिन dataframe में मूल मूल्यों को नहीं बदला। प्रतिस्थापन विधि स्वयं बदल गई और नए मानों को सही तरीके से वापस कर दिया, लेकिन इनस्थल विकल्प एक सशर्त लागू करते समय मूल डेटाफ्रेम को प्रभावित नहीं करता है। अनुभवी पांडस उपयोगकर्ताओं के लिए यह स्पष्ट हो सकता है, लेकिन निश्चित रूप से प्रत्येक सिंगल तत्व पर लूपिंग के बजाय ऐसा करने का कुछ आसान तरीका होना चाहिए?

संपादित करें (x2):

: उसकी एक एक और दृष्टिकोण है जो भी काम नहीं किया (": सरणी सुरक्षित रूप से आवश्यक प्रकार में ढाला नहीं जा सकता है लेखन त्रुटि" 'प्रतिस्थापन की लंबाई श्रृंखला लंबाई के बराबर होना चाहिए' और) का एक उदाहरण है
oldNewMap = {1:2, 2:3} 
df2 = DataFrame({"year":[2000,2000,2000,2001,2001,2001],"ethnicity":[1,2,1,2,3,1]}) 
df2['ethnicity'][df2.year==2000] = df2['ethnicity'][df2.year==2000].map(oldNewMap) 

संपादित करें: यह स्थापना/संस्करण के लिए विशिष्ट समस्याएं प्रतीत होता है क्योंकि यह मेरे अन्य कंप्यूटर पर ठीक काम करता है।

उत्तर

10

यह सिर्फ आसान हो सकता है कि यह एक अलग तरह से करना है:

oldNewMap = {1: 3, 2: 3, 3: 4, 4: 2, 5: 1, 91: 6} 
df['ethnicity'][df.year==year] = df['ethnicity'][df.year==year].map(oldNewMap) 
+0

धन्यवाद! मैंने कोशिश की और कुछ इसी तरह की, लेकिन, उत्सुकता से, यह काम नहीं करता है क्योंकि पायथन कहते हैं कि "सरणी को सुरक्षित प्रकार से सुरक्षित रूप से नहीं रखा जा सकता" क्योंकि उनके पास "असमान लंबाई" है। हालांकि, वे नहीं करते! दाईं ओर बाएं हाथ की श्रृंखला बराबर लंबाई के हैं। हो सकता है कि पांडा पूरे डेटाफ्रेम की लंबाई का उपयोग करे और न कि सीपी शैली वाक्यविन्यास का उपयोग करते हुए बनाई गई सीरीज़? – hmelberg

+0

@ user2040900: यह मेरे लिए काम करता है। आप पांडों का किस संस्करण का उपयोग कर रहे हैं? जब आप इसे आजमाते हैं तो क्या होता है इसका एक उदाहरण दिखाने के लिए आप अपना प्रश्न संपादित कर सकते हैं? – BrenBarn

+0

उदाहरण के लिए संपादित देखें। पायथन 2.7, पांडस 0.10.1। – hmelberg