我正在寻找一种高效的方法,将一系列数据转换为其索引和值的元组。
s = pd.Series([1, 2, 3], ['a', 'b', 'c'])
我想要一个数组、列表、序列或可迭代对象:
[(1, 'a'), (2, 'b'), (3, 'c')]
看起来很简单,zip(s,s.index)
就能解决问题!
对于Python-3.x版本,我们需要用 list
包装它 -
list(zip(s,s.index))
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'))
list(zip(s,s.index))
,否则在Python3中会得到一个zip对象。 - Claudiu Creangas.items()
s.iteritems()
}},就像在Python 2中一样,区别在于iteritems()
返回一个迭代器,而items()
返回一个列表。要将输出作为列表而不是迭代器获取,可以使用:list(s.items())
)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
pd.Series()
调用实际上将['a', 'b', 'c']
设为了索引,将[1, 2, 3]
设为了数据,这可能不是你期望的结果。但是你的示例表明你想要先有 1、2、3 成为索引。list(s.items())
返回[('a', 1), ('b', 2), ('c', 3)]
。所以这似乎是你需要的;也许你只需要在声明中翻转索引和数据。 - smci