9

このRの質問と同様に、Pandasを使用してシリーズの各アイテム(またはDataFrameの各行)に関数を適用したいのですが、この関数の引数としてその行のインデックスまたはIDを使用したいと思います。簡単な例として、[(index_i、value_i)、...、(index_n、value_n)]の形式のタプルのリストを作成するとします。単純なPythonforループを使用して、次のことができます。

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

しかし、これを行うためのより効率的な方法が必要ですか?おそらく、Series.applyのようなもっとパンダっぽいものですか?実際には、私は(この場合)意味のあるものを返すことについて心配していませんが、「適用」のようなものの効率についてはもっと心配しています。何か案は?

4

2 に答える 2

7

関数でapplyメソッドを使用すると、シリーズ内のすべてのアイテムがそのような関数でマップされます。例えば

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

たとえば、すべてのエンティティの文字列を合計したい場合はどうなりますか?

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

applyのより複雑な使用法は、次のとおりです。

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

[編集]

明確化のためのOPの質問に続いて:シリーズ(1D)とデータフレーム(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

とにかく、巨大なメモリリークを避けるために、他のデータ型に切り替えることをお勧めします。

于 2012-06-23T16:00:18.127 に答える
3

itertoolscountzip:を使用した、きちんとした方法があります。

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))!よりも効率的です。

于 2012-12-11T20:47:51.080 に答える