2012-06-23 19 views
9

this R question के समान, मैं पांडों का उपयोग करके श्रृंखला में प्रत्येक आइटम (या डेटाफ्रेम में प्रत्येक पंक्ति) में एक फ़ंक्शन लागू करना चाहता हूं, लेकिन इस फ़ंक्शन को इंडेक्स या आईडी के लिए तर्क के रूप में उपयोग करना चाहता हूं उस पंक्ति का। एक मामूली उदाहरण के रूप में, मान लें कि कोई फ़ॉर्म के tuples की एक सूची बनाना चाहता है [(index_i, value_i), ..., (index_n, value_n)]। पाश के लिए एक सरल अजगर का उपयोग करना, मैं कर सकते हैं: पांडा पंक्ति विशिष्ट लागू

In [1] L = [] 
In [2] s = Series(['six', 'seven', 'six', 'seven', 'six'], 
      index=['a', 'b', 'c', 'd', 'e']) 
In [3] for i, item in enumerate(s): 
      L.append((i,item)) 
In [4] L 
Out[4] [(0, 'six'), (1, 'seven'), (2, 'six'), (3, 'seven'), (4, 'six')] 

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

उत्तर

7

यदि आप फ़ंक्शन के साथ लागू विधि का उपयोग करते हैं तो क्या होता है कि श्रृंखला में प्रत्येक आइटम को इस तरह के फ़ंक्शन के साथ मैप किया जाएगा। जैसे

>>> s.apply(enumerate) 
a <enumerate object at 0x13cf910> 
b <enumerate object at 0x13cf870> 
c <enumerate object at 0x13cf820> 
d <enumerate object at 0x13cf7d0> 
e <enumerate object at 0x13ecdc0> 

आप जो करना चाहते हैं वह केवल श्रृंखला को गिनने के लिए है।

>>> list(enumerate(s)) 
[(0, 'six'), (1, 'seven'), (2, 'six'), (3, 'seven'), (4, 'six')] 

उदाहरण के लिए यदि आप सभी संस्थाओं की स्ट्रिंग को जोड़ना चाहते हैं तो क्या होगा?

>>> from functools import partial 
>>> s.apply(partial(map, lambda x: x*2)) 
a    ['ss', 'ii', 'xx'] 
b ['ss', 'ee', 'vv', 'ee', 'nn'] 
c    ['ss', 'ii', 'xx'] 
d ['ss', 'ee', 'vv', 'ee', 'nn'] 
e    ['ss', 'ii', 'xx'] 

[संपादित करें]

स्पष्टीकरण के लिए ओ पी के सवाल के बाद:

>>> ",".join(s) 
'six,seven,six,seven,six' 

लागू की एक अधिक जटिल उपयोग यह एक होगा साथ श्रृंखला (1 डी) भ्रमित न हों डेटाफ्रेम (2 डी) http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe - क्योंकि मैं वास्तव में नहीं देखता कि आप पंक्तियों के बारे में कैसे बात कर सकते हैं।

>>> Series([s[x]+" my index is: "+x for x in s.keys()], index=s.keys()) 
a  six index a 
b seven index b 
c  six index c 
d seven index d 
e  six index e 

किसी भी तरह मैं सुझाव है कि आप अन्य डेटा प्रकार के लिए स्विच विशाल मेमोरी लीक से बचने के लिए: हालांकि आप एक नई श्रृंखला बनाकर अपने समारोह में सूचकांक शामिल कर सकते हैं (लागू अभ्यस्त आप वर्तमान सूचकांक के बारे में कोई जानकारी दे)।

+0

संकेतक के बारे में सूचक के लिए @ luke14free धन्यवाद। अंत में, मैंने शायद एक अत्यधिक सरल उदाहरण प्रदान किया, लेकिन आपने वास्तव में एक उपयुक्त उत्तर प्रदान किया था। हालांकि मैं वास्तव में क्या चाहता हूं, आपके तीसरे उदाहरण की तरह कुछ है, जो कहा गया है कि एक्सपोनेंट पंक्ति या अनुक्रमणिका का एक कार्य है ... –

+0

अरे @ करसनफार्मर - मेरा अंतिम संपादन – luke14free

+0

धन्यवाद @ luke14free। अंत में, जैसा आपने सुझाव दिया था मैंने किया था, और मेरे डेटा को पुनर्गठन करके एक अलग तरीके से मेरी समस्या को हल करने के बारे में बताया। –

3

यहाँ एक साफ रास्ता है, itertools के count और zip का उपयोग कर: enumerate(list(s))

import pandas as pd 
from itertools import count 

s = pd.Series(['six', 'seven', 'six', 'seven', 'six'], 
        index=['a', 'b', 'c', 'd', 'e']) 

In [4]: zip(count(), s) 
Out[4]: [(0, 'six'), (1, 'seven'), (2, 'six'), (3, 'seven'), (4, 'six')] 

दुर्भाग्य से, केवल की तुलना में कुशल!

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