python - पंडों के डेटाफ्रेम में श्रेणियों/डिब्बे में संख्यात्मक डेटा को कैसे मैप किया जाए



python-2.7 pandas (1)

पंडों के साथ, आपको पंक्ति-वार संचालन से बचना चाहिए, क्योंकि इनमें आमतौर पर एक अक्षम पायथन-स्तरीय लूप शामिल होता है। यहाँ कुछ विकल्प दिए गए हैं।

पंडों: pd.cut

जैसा कि @JonClements सुझाव देता है, आप इसके लिए pd.cut उपयोग कर सकते हैं, यहां लाभ यह है कि आपका नया कॉलम एक Categorical हो जाता है।

आपको केवल अपनी सीमाओं ( np.inf सहित) और श्रेणी के नामों को परिभाषित करने की आवश्यकता है, फिर इच्छित संख्यात्मक कॉलम के लिए pd.cut लागू करें।

bins = [0, 2, 18, 35, 65, np.inf]
names = ['<2', '2-18', '18-35', '35-65', '65+']

df['AgeRange'] = pd.cut(df['Age'], bins, labels=names)

print(df.dtypes)

# Age             int64
# Age_units      object
# AgeRange     category
# dtype: object

NumPy: np.digitize

np.digitize एक और साफ समाधान प्रदान करता है। विचार यह है कि अपनी सीमाओं और नामों को परिभाषित करें, एक शब्दकोश बनाएं, फिर अपने आयु कॉलम में np.digitize लागू करें। अंत में, अपने श्रेणी नामों को मैप करने के लिए अपने शब्दकोश का उपयोग करें।

ध्यान दें कि सीमा मामलों के लिए निचले बाउंड का उपयोग बिन में मैपिंग के लिए किया जाता है।

import pandas as pd, numpy as np

df = pd.DataFrame({'Age': [99, 53, 71, 84, 84],
                   'Age_units': ['Y', 'Y', 'Y', 'Y', 'Y']})

bins = [0, 2, 18, 35, 65]
names = ['<2', '2-18', '18-35', '35-65', '65+']

d = dict(enumerate(names, 1))

df['AgeRange'] = np.vectorize(d.get)(np.digitize(df['Age'], bins))

परिणाम

   Age Age_units AgeRange
0   99         Y      65+
1   53         Y    35-65
2   71         Y      65+
3   84         Y      65+
4   84         Y      65+

मैंने अभी-अभी अजगर में कोडिंग शुरू की है, और मेरे सामान्य कोडिंग कौशल में काफी कमी है :( इसलिए कृपया थोड़ा सा धैर्य रखें

मेरे पास एक पांडा डेटाफ़्रेम है:

इसकी लगभग 3 मी पंक्तियाँ हैं। 3 प्रकार के आयु_ हैं: वर्ष, दिन और सप्ताह के लिए वाई, डी, डब्ल्यू। 1 वर्ष से अधिक उम्र के किसी भी व्यक्ति की Y की एक आयु इकाई है और मैं चाहता हूं कि मेरा पहला समूहन <2y पुराना है, इसलिए मुझे आयु इकाइयों में परीक्षण करना है ...

मैं एक नया स्तंभ बनाना चाहता हूँ AgeRange और निम्नलिखित श्रेणियों के साथ आबाद करें:

  • <2
  • 2 - 18
  • 18 - 35
  • ३५ - ६५
  • 65 +

इसलिए मैंने एक फंक्शन लिखा

def agerange(values):
    for i in values:
        if complete.Age_units == 'Y':
            if complete.Age > 1 AND < 18 return '2-18'
            elif complete.Age > 17 AND < 35 return '18-35'
            elif complete.Age > 34 AND < 65 return '35-65'
            elif complete.Age > 64 return '65+'
        else return '< 2'

मैंने सोचा कि अगर मैं पूरी तरह से डेटाफ्रेम में पास हो गया तो मुझे वह वापस मिल जाएगा जो मुझे चाहिए था और फिर वह कॉलम बना सकता था जो मुझे कुछ इस तरह चाहिए था:

agedetails['age_range'] = ageRange(agedetails)

लेकिन जब मुझे मिलने वाला फ़ंक्शन बनाने के लिए मैं पहला कोड चलाने की कोशिश करता हूँ:

  File "<ipython-input-124-cf39c7ce66d9>", line 4
    if complete.Age > 1 AND complete.Age < 18 return '2-18'
                          ^
SyntaxError: invalid syntax

स्पष्ट रूप से यह AND को स्वीकार नहीं कर रहा है - लेकिन मुझे लगा कि मैंने कक्षा में सुना है कि मैं इसका उपयोग कर सकता हूं या इसे पसंद कर सकता हूं? मुझसे गलती हुई होगी लेकिन फिर ऐसा करने का सही तरीका क्या होगा?

इसलिए उस त्रुटि को प्राप्त करने के बाद, मुझे यकीन नहीं है कि डेटाफ्रेम में पास होने की विधि एक त्रुटि भी फेंक देगी। मैं शायद हाँ का अनुमान लगा रहा हूँ। किस मामले में - मैं उस काम को कैसे करूंगा?

मैं सबसे अच्छी विधि सीखना चाहता हूं, लेकिन मेरे लिए सबसे अच्छी विधि का एक हिस्सा इसे सरल बना रहा है, भले ही इसका मतलब है कि कुछ ही घंटों में चीजें करना ...





dataframe