Подтвердить что ты не робот

Как преобразовать серию pandas в кортеж индекса и значения

Я ищу эффективный способ преобразования ряда в кортеж своего индекса со своими значениями.

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

Мне нужен массив, список, серия, некоторые итерабельные:

[(1, 'a'), (2, 'b'), (3, 'c')]
4b9b3361

Ответ 1

Ну, похоже, просто 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'))

Ответ 2

Одной из возможностей является замена порядка элементов индекса и значений из iteritems:

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

EDIT: ответ @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

Ответ 3

s.items() или s.iteritems() сделать это.

(Если вы хотите получить вывод как список, а не итератор list(s.items()))

Ответ 4

Как насчет:

[x for x in s.items()]