2012-06-23 11 views
9

this R questionと同様に、Series(またはDataFrameの各行)の各アイテムにPandasを使用して関数を適用したいが、この関数の引数としてインデックスまたはIDを使用したいその列の。簡単な例として、[(index_i、value_i)、...、(index_n、value_n)]という形のタプルのリストを作成したいとします。ループのためのシンプルなPythonの使用、私が行うことができます。 pandas row specific apply

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')] 

しかし、これを行うには、より効率的な方法が存在しなければなりませんか?おそらくもっと何かPanda-ishはSeries.applyのようなものでしょうか?実際には、意味のあるものを返すことについては心配していませんが、「適用」のようなものの効率性についてはもっと心配しています。何か案は?

答えて

7

関数でapplyメソッドを使用すると、Seriesのすべてのアイテムがこのような関数にマップされます。例えば。

>>> 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')] 

たとえば、すべてのエンティティの文字列を合計する場合はどうなりますか?シリーズ(1D)を混同しないでくださいと:明確化のためのOPの質問に続いて

>>> 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のようになりDataFrames(2D)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は約列挙するポインタです。結局、私はおそらくあまりにも単純な例を提供しましたが、あなたは本当に適切な答えを提供しました。私が本当に望んでいるのは、3番目の例のようなもので、指数が行またはインデックスの関数であるという条件が追加されています... –

+0

ちょっと@CarsonFarmer - 最後の編集を参照してください – luke14free

+0

ありがとう@ luke14free。最後に、私が提案したようにして、自分のデータを再構築することによって、私の問題を別の方法で解決しようとしました。 –

3

はここitertoolsのcountzipを使用して、きちんとした方法です:

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')] 

残念ながら、唯一のように効率的によりenumerate(list(s))

関連する問題