web-dev-qa-db-ja.com

pandasシリーズをインデックスと値のタプルに変換する方法

私は、値を持つインデックスのタプルにシリーズを変換する効率的な方法を探しています。

s = pd.Series([1, 2, 3], ['a', 'b', 'c'])

配列、リスト、シリーズ、反復可能なものが必要です:

[(1, 'a'), (2, 'b'), (3, 'c')]
19
piRSquared

まあ、それは単純に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'))
_
29
Divakar

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
8
abeboparebop

s.items()またはs.iteritems()これを行います。

(イテレータlist(s.items())ではなくリストとして出力を取得する場合)

6
smci