web-dev-qa-db-fra.com

comment convertir pandas series en Tuple d'index et de valeur

Je cherche un moyen efficace de convertir une série en un tuple de son index avec ses valeurs.

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

Je veux un tableau, une liste, une série, certains itérables:

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

Eh bien, il semble que Zip(s,s.index) fonctionne aussi!

Pour Python-3.x, nous devons l'encapsuler avec list -

list(Zip(s,s.index))

Pour obtenir un tuple de tuples, utilisez Tuple(): Tuple(Zip(s,s.index)).

Exemple d'exécution -

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

Une possibilité consiste à échanger l'ordre des éléments d'index et les valeurs de iteritems:

res = [(val, idx) for idx, val in s.iteritems()]

EDIT: La réponse de @ Divakar est plus rapide d'environ un facteur 2. Construire une série de chaînes aléatoires pour les tests:

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)

Calendrier:

%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() ou s.iteritems() faites cela.

(Si vous souhaitez obtenir la sortie sous forme de liste plutôt que d'itérateur list(s.items()))

6
smci