Как преобразовать серию pandas в кортеж индекса и значения
Я ищу эффективный способ преобразования ряда в кортеж своего индекса со своими значениями.
s = pd.Series([1, 2, 3], ['a', 'b', 'c'])
Мне нужен массив, список, серия, некоторые итерабельные:
[(1, 'a'), (2, 'b'), (3, 'c')]
Ответ 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()))