如何将pandas系列转换为索引和值的元组

piR*_*red 20 python iterable series pandas

我正在寻找一种有效的方法,将一个系列转换为其索引的元组及其值.

s = pd.Series([1, 2, 3], ['a', 'b', 'c'])
Run Code Online (Sandbox Code Playgroud)

我想要一个数组,列表,系列,一些可迭代:

[(1, 'a'), (2, 'b'), (3, 'c')]
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 31

好吧它似乎也很zip(s,s.index)有效!

对于Python-3.x,我们需要用list- 包装它-

list(zip(s,s.index))
Run Code Online (Sandbox Code Playgroud)

要获得元组元组,请使用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'))
Run Code Online (Sandbox Code Playgroud)

  • 应该是`list(zip(s,s.index))`否则你在python3中得到一个zip对象 (3认同)

abe*_*bop 8

一种可能性是交换索引元素的顺序和来自的值iteritems:

res = [(val, idx) for idx, val in s.iteritems()]
Run Code Online (Sandbox Code Playgroud)

编辑:@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)
Run Code Online (Sandbox Code Playgroud)

时序:

%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
Run Code Online (Sandbox Code Playgroud)


smc*_*mci 6

s.items()s.iteritems()这样做。

(如果要以列表而不是迭代器的形式获取输出list(s.items())