2014-10-30 10 views
37

लागू करता है मैं पांडों में पूरे DataFrame पर लागू फ़ंक्शन में एक पंक्ति के सूचकांक तक पहुंचने का प्रयास कर रहा हूं। मैं कुछ इस तरह है:पांडा में एक पंक्ति का सूचकांक प्राप्त करना

df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c']) 
>>> df 
    a b c 
0 1 2 3 
1 4 5 6 

और मुझे लगता है कि किसी पंक्ति

def rowFunc(row): 
    return row['a'] + row['b'] * row['c'] 

साथ तत्वों का उपयोग एक समारोह को परिभाषित करेंगे मैं यह इतना की तरह लागू कर सकते हैं:

df['d'] = df.apply(rowFunc, axis=1) 
>>> df 
    a b c d 
0 1 2 3 7 
1 4 5 6 34 

बहुत बढ़िया! अब क्या होगा यदि मैं अपने फ़ंक्शन में इंडेक्स को शामिल करना चाहता हूं? d जोड़ने से पहले DataFrame में दिए गए किसी भी पंक्ति की अनुक्रमणिका Index([u'a', u'b', u'c', u'd'], dtype='object') होगी, लेकिन मुझे 0 और 1 चाहिए। इसलिए मैं केवल row.index तक नहीं पहुंच सकता।

मैं जानता हूँ कि मैं मेज, जहां मैं सूचकांक की दुकान में एक अस्थायी स्तंभ बना सकते हैं, लेकिन मैं "हूँ सोच अगर यह कहीं पंक्ति वस्तु में sotred है।

+1

: वहाँ एक कारण है कि आप 'apply' उपयोग करने की आवश्यकता है? फ्रेम पर वेक्टरकृत ओप करने से यह बहुत धीमी है। (कभी-कभी * कुछ करने का सबसे आसान तरीका * लागू होता है, और प्रदर्शन विचार अक्सर अतिरंजित होते हैं, लेकिन आपके विशेष उदाहरण के लिए यह उपयोग करने के लिए आसान * नहीं * है।) – DSM

+1

@DSM वास्तविकता में मैं प्रत्येक पंक्ति के लिए अन्य ऑब्जेक्ट कन्स्ट्रक्टर को कॉल कर रहा हूं विभिन्न पंक्ति तत्वों का उपयोग कर। मैं सिर्फ प्रश्न को स्पष्ट करने के लिए एक साथ एक न्यूनतम उदाहरण रखना चाहता था। – Mike

+0

'लागू करें()' वह Droid नहीं है जिसे आप ढूंढ रहे हैं; इसके बजाय 'df.iterrows()' का उपयोग करें। मेरा जवाब देखें यह एक XY समस्या – smci

उत्तर

45

आप का उपयोग इस मामले में सूचकांक का उपयोग करने के name विशेषता:

In [182]: 

df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c']) 
def rowFunc(row): 
    return row['a'] + row['b'] * row['c'] 

def rowIndex(row): 
    return row.name 
df['d'] = df.apply(rowFunc, axis=1) 
df['rowIndex'] = df.apply(rowIndex, axis=1) 
df 
Out[182]: 
    a b c d rowIndex 
0 1 2 3 7   0 
1 4 5 6 34   1 

ध्यान दें कि यदि यह सच है तो आप उस निम्न कार्य करने का प्रयास कर और तेज हो गया है कर रहे हैं क्या:

In [198]: 

df['d'] = df['a'] + df['b'] * df['c'] 
df 
Out[198]: 
    a b c d 
0 1 2 3 7 
1 4 5 6 34 

In [199]: 

%timeit df['a'] + df['b'] * df['c'] 
%timeit df.apply(rowIndex, axis=1) 
10000 loops, best of 3: 163 µs per loop 
1000 loops, best of 3: 286 µs per loop 
+0

किसी और के लिए चेतावनी है। मुझे लगता है कि आप 'row.name' से प्राप्त सूचकांक पंक्ति की संख्यात्मक अनुक्रमणिका है। यदि आपके पास कस्टम इंडेक्स है (प्रत्येक पंक्ति के लिए एक स्ट्रिंग यूयूआईडी कहें) तो आप इसे 'लागू' के अंदर एक्सेस नहीं कर सकते हैं। अतिरिक्त उलझन में, पंक्ति 'एन' के लिए,' df.iloc [n] .name' 'लागू' के बाहर पंक्ति एन के यूयूआईडी वापस कर देगा, लेकिन 'लागू' 'row.name' के अंदर 'n' वापस आएगा ... देखें : http://stackoverflow.com/questions/18316211/access-index-in-pandas-series-apply – Owen

+2

@ ओवेन लिंक किए गए प्रश्न में, वह एक श्रृंखला है जो एक सीरीज़ नहीं है, एक श्रृंखला के लिए आप एक्सेस नहीं कर सकते इस तरह सूचकांक मूल्य, आप एक डीएफ के लिए कर सकते हैं। एक श्रृंखला के लिए आपको जेफ के उत्तर को डेटाफ्रेम में कनवर्ट करने की आवश्यकता होगी, आप श्रृंखला पर 'to_frame() 'भी कर सकते हैं – EdChum

0

apply() वह Droid नहीं है जिसे आप ढूंढ रहे हैं।

DataFrame.iterrows() आप पंक्तियों पर चीज़ों को दोहरा सकते हैं और उनके नाम का उपयोग: एक तरफ

for name, row in df.iterrows(): 
    ... 
संबंधित मुद्दे