कॉलम और पंक्तियों पर apply()
axis=0 और axis=1 के साथ DataFrame.apply() का उपयोग करके प्रत्येक कॉलम या पंक्ति पर कस्टम फ़ंक्शन चलाएँ।
कॉलम और पंक्तियों पर apply(), CoddyKit पर Pandas & NumPy Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Pandas & NumPy Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Pandas & NumPy Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
apply() का उपयोग कब करें
DataFrame.apply() प्रत्येक कॉलम (axis=0) या प्रत्येक पंक्ति (axis=1) पर एक कस्टम Python फ़ंक्शन चलाता है। यह अंतिम विकल्प का उपकरण है — अंतर्निर्मित वेक्टरकृत संचालन से धीमा — लेकिन तब आवश्यक है जब किसी गणना को NumPy अंकगणित, बूलियन इंडेक्सिंग या अंतर्निर्मित एकत्रीकरण फ़ंक्शन के रूप में व्यक्त नहीं किया जा सकता। इसका उपयोग तब करें जब आपको जटिल सशर्त तर्क, कस्टम स्ट्रिंग पार्सिंग या एक समय में एक पंक्ति अथवा कॉलम पर काम करने वाली बहु-चरणीय गणनाओं की आवश्यकता हो।
import pandas as pd
import numpy as np
df = pd.DataFrame({
'price': [10.5, 25.0, 8.3, 100.0],
'quantity': [3, 1, 5, 2],
'tax_rate': [0.05, 0.10, 0.05, 0.15]
})
print(df)कॉलमों पर apply() (axis=0)
axis=0 (डिफ़ॉल्ट) के साथ apply() प्रत्येक कॉलम को Series के रूप में फ़ंक्शन को भेजता है। फ़ंक्शन को एक बार में एक कॉलम मिलता है और उसे एक scalar (एकत्रीकरण के लिए) या Series (रूपांतरण के लिए) लौटाना चाहिए। एक ही कॉल में सभी संख्यात्मक कॉलमों पर कस्टम सामान्यीकरण या सफ़ाई चरण समान रूप से लागू करने के लिए यह उपयोगी है।
# Custom range normalisation (0 to 1) for each column
def min_max_scale(col):
return (col - col.min()) / (col.max() - col.min())
df_scaled = df[['price', 'quantity']].apply(min_max_scale, axis=0)
print(df_scaled)पंक्तियों पर apply() (axis=1)
axis=1 के साथ apply() प्रत्येक पंक्ति को Series के रूप में फ़ंक्शन को भेजता है। पंक्ति का index कॉलम का नाम होता है, इसलिए आप नाम से मानों तक पहुँच सकते हैं। यह कई कॉलमों पर निर्भर पंक्ति-स्तरीय गणनाओं के लिए आदर्श है, जैसे कर के बाद कुल revenue निकालना, जहाँ हर पंक्ति की अपनी कर दर होती है।
def revenue_after_tax(row):
subtotal = row['price'] * row['quantity']
return subtotal * (1 + row['tax_rate'])
df['revenue_after_tax'] = df.apply(revenue_after_tax, axis=1)
print(df)apply() से कई मान लौटाना
apply(axis=1) को दिए गए फ़ंक्शन से नामित प्रविष्टियों वाली pd.Series लौटाई जा सकती है, जिसे Pandas कई नए कॉलमों में विस्तारित कर देता है। दो नए कॉलमों के लिए apply() को दो बार बुलाने की तुलना में यह अधिक साफ़ तरीका है। वैकल्पिक रूप से, फ़ंक्शन dict लौटा सकता है, जिसे Pandas कॉलमों में विस्तारित कर देता है।
def compute_totals(row):
subtotal = row['price'] * row['quantity']
tax = subtotal * row['tax_rate']
return pd.Series({'subtotal': subtotal, 'tax': tax, 'total': subtotal + tax})
result = df.apply(compute_totals, axis=1)
print(result)कॉलमों पर कस्टम एकत्रीकरण के लिए apply()
प्रत्येक कॉलम के लिए कस्टम सांख्यिकी निकालने और सारांश Series लौटाने के लिए apply(func, axis=0) का उपयोग करें। उदाहरण के लिए, एक ही कॉल में हर संख्यात्मक कॉलम के लिए परिवर्तनशीलता का गुणांक (मानक विचलन को माध्य से विभाजित करके) निकालें। परिणाम कॉलम नाम के अनुसार index की गई Series होती है, जो प्रत्येक कॉलम के त्वरित निदान के लिए उपयोगी है।
def coeff_of_variation(col):
return col.std() / col.mean() if col.mean() != 0 else np.nan
cv = df[['price', 'quantity']].apply(coeff_of_variation, axis=0)
print('Coefficient of variation per column:')
print(cv)apply() और वेक्टरकृत विकल्पों की तुलना
apply() का उपयोग करने से पहले हमेशा जाँच लें कि कोई वेक्टरकृत विकल्प उपलब्ध है या नहीं। कर के बाद revenue की गणना के लिए df['price'] * df['quantity'] * (1 + df['tax_rate']), apply(axis=1) वाले संस्करण के समान काम करता है, लेकिन 10–100 गुना तेज़ चलता है क्योंकि यह NumPy के C-स्तरीय loops का उपयोग करता है। apply() को उन मामलों के लिए रखें जहाँ वेक्टरकृत तर्क अत्यधिक जटिल और अपठनीय हो।
import time
start = time.time()
df['vectorised'] = df['price'] * df['quantity'] * (1 + df['tax_rate'])
print('Vectorised:', time.time() - start, 's')
start = time.time()
df['apply_result'] = df.apply(revenue_after_tax, axis=1)
print('apply():', time.time() - start, 's')lambda के साथ apply()
छोटे, एक-पंक्ति वाले रूपांतरणों के लिए नामित फ़ंक्शन परिभाषित करने के बजाय सीधे lambda को apply() में दें। सरल कार्यों के लिए lambda संक्षिप्त होते हैं, लेकिन जटिल तर्क के लिए इनसे बचना चाहिए, जहाँ टिप्पणियों वाला नामित फ़ंक्शन समझने और जाँचने में आसान होता है। lambda का सीमित उपयोग करें — उन्हें नाम से यूनिट-जाँच या प्रोफ़ाइल करना आसान नहीं होता।
# Clip revenue between 0 and 200, then round to nearest 10
df['revenue_clean'] = df['revenue_after_tax'].apply(lambda x: round(min(max(x, 0), 200) / 10) * 10)
print(df[['revenue_after_tax', 'revenue_clean']])apply() में अतिरिक्त तर्क भेजना
args tuple या apply(func, args=(val,), axis=1) में कीवर्ड तर्कों का उपयोग करके अपने फ़ंक्शन में अतिरिक्त तर्क भेजें। इससे फ़ंक्शन के भीतर वैश्विक variables का उपयोग नहीं करना पड़ता और अलग-अलग पैरामीटर मानों के साथ फ़ंक्शन का पुनः उपयोग किया जा सकता है। Python 3.8+ में आप फ़ंक्शन का आंशिक रूप से लागू संस्करण बनाने के लिए functools.partial का भी उपयोग कर सकते हैं।
def discount_price(row, discount_pct, threshold):
if row['quantity'] >= threshold:
return row['price'] * (1 - discount_pct)
return row['price']
df['discounted_price'] = df.apply(
discount_price, axis=1,
args=(0.1, 3) # 10% discount for quantity >= 3
)
print(df[['price', 'quantity', 'discounted_price']])प्रकार रूपांतरण के लिए apply()
जब किसी कॉलम में मिले-जुले प्रकार हों — कुछ पूर्णांक, कुछ दशमलव और कुछ स्ट्रिंग — तो astype() त्रुटि उत्पन्न करता है। पंक्ति-दर-पंक्ति रूपांतरण का प्रयास करने और जिन मानों का रूपांतरण न हो सके उनके लिए NaN लौटाने हेतु apply(pd.to_numeric, errors='coerce') का उपयोग करें। यह उन कॉलमों के लिए सुरक्षित तरीका है जो संख्यात्मक होने चाहिए, लेकिन डेटा प्रविष्टि की त्रुटियों के कारण कभी-कभी उनमें गैर-संख्यात्मक प्रविष्टियाँ होती हैं।
messy = pd.Series(['10', '20.5', 'N/A', '100', '--'])
clean = messy.apply(pd.to_numeric, errors='coerce')
print(clean)प्रदर्शन: apply() बनाम np.vectorize
जब scalar पर लागू होने वाले फ़ंक्शन को प्रत्येक तत्व पर लागू करना हो, तो np.vectorize(func)(array) आम तौर पर Series.apply(func) से तेज़ होता है, क्योंकि NumPy का vectorize Python के फ़ंक्शन-कॉल overhead के बजाय C के माध्यम से dispatch करता है। हालांकि, np.vectorize वास्तविक broadcasting से अब भी धीमा है — इसका उपयोग केवल तब करें जब कोई broadcasting expression इस तर्क को व्यक्त न कर सके।
def classify_size(price):
if price < 15:
return 'small'
elif price < 50:
return 'medium'
return 'large'
# np.vectorize approach
classify_v = np.vectorize(classify_size)
df['size_class'] = classify_v(df['price'].values)
print(df[['price', 'size_class']])apply() सही विकल्प कब है
Apply तब सही उपकरण है जब: (1) तर्क के लिए एक साथ कई कॉलम मानों के आधार पर branching आवश्यक हो; (2) फ़ंक्शन प्रत्येक पंक्ति के लिए किसी बाहरी API या database को बुलाता हो (और क्रमिक रूप से चलना अनिवार्य हो); (3) फ़ंक्शन किसी cell में संग्रहीत JSON blob जैसी जटिल स्ट्रिंग को पार्स करता हो; या (4) फ़ंक्शन list जैसी बदलती लंबाई वाली वस्तु लौटाता हो। अन्य सभी मामलों में गति और पठनीयता के लिए वेक्टरकृत संचालन को प्राथमिकता दें।
import json
# Parse a JSON metadata column row by row
df['metadata'] = ['{"color": "red"}', '{"color": "blue"}', '{}', '{"color": "green"}']
df['color'] = df['metadata'].apply(lambda s: json.loads(s).get('color', 'unknown'))
print(df[['metadata', 'color']])त्वरित जाँच
इस पाठ से Data Analysis की अवधारणाओं के बारे में अपनी समझ जाँचें।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: स्तंभ-स्तरीय कस्टम आँकड़े निकालने के लिए apply(axis=0) का उपयोग करना, कई स्तंभों के इनपुट के साथ पंक्ति-स्तरीय गणनाएँ करने के लिए apply(axis=1) का उपयोग करना, और प्रदर्शन के लिए वेक्टरकृत विकल्पों को कब प्राथमिकता देनी है, यह पहचानना। आगे हम जटिल समूह-स्तरीय एकत्रीकरण के लिए GroupBy के साथ apply() का उपयोग देखेंगे।
एआई शिक्षक के साथ Python सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “कॉलम और पंक्तियों पर apply()” पाठ निःशुल्क है?
हाँ—“कॉलम और पंक्तियों पर apply()” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Pandas & NumPy Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Pandas & NumPy Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“कॉलम और पंक्तियों पर apply()” में मैं क्या सीखूँगा?
axis=0 और axis=1 के साथ DataFrame.apply() का उपयोग करके प्रत्येक कॉलम या पंक्ति पर कस्टम फ़ंक्शन चलाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Pandas & NumPy Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Pandas & NumPy Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Pandas & NumPy Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“कॉलम और पंक्तियों पर apply()” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Pandas & NumPy Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Pandas & NumPy Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- कॉलम और पंक्तियों पर apply()
- GroupBy के साथ apply()
- तत्व-स्तरीय ऑपरेशन के लिए map() और applymap()
- pipe() से विधि-श्रृंखलन