私は、値を持つインデックスのタプルにシリーズを変換する効率的な方法を探しています。
s = pd.Series([1, 2, 3], ['a', 'b', 'c'])
配列、リスト、シリーズ、反復可能なものが必要です:
[(1, 'a'), (2, 'b'), (3, 'c')]
まあ、それは単純にZip(s,s.index)
も動作するようです!
Python-3.xの場合、list
でラップする必要があります-
_list(Zip(s,s.index))
_
タプルのタプルを取得するには、Tuple()
を使用します:Tuple(Zip(s,s.index))
。
サンプル実行-
_In [8]: s
Out[8]:
a 1
b 2
c 3
dtype: int64
In [9]: list(Zip(s,s.index))
Out[9]: [(1, 'a'), (2, 'b'), (3, 'c')]
In [10]: Tuple(Zip(s,s.index))
Out[10]: ((1, 'a'), (2, 'b'), (3, 'c'))
_
1つの可能性は、インデックス要素の順序とiteritems
の値を入れ替えることです。
res = [(val, idx) for idx, val in s.iteritems()]
編集:@Divakarの答えは約2倍速くなります。テスト用の一連のランダム文字列を作成します:
N = 100000
str_len = 4
ints = range(N)
strs = [None]*N
for i in ints:
strs[i] = ''.join(random.choice(string.ascii_letters) for _ in range(str_len))
s = pd.Series(ints, strs)
タイミング:
%timeit res = Zip(s,s.index)
>>> 100 loops, best of 3: 14.8 ms per loop
%timeit res = [(val, idx) for idx, val in s.iteritems()]
>>> 10 loops, best of 3: 26.7 ms per loop
s.items()
またはs.iteritems()
これを行います。
(イテレータlist(s.items())
ではなくリストとして出力を取得する場合)