如何将 Pandas Series 转换为索引和值的元组

56
我正在寻找一种高效的方法,将一系列数据转换为其索引和值的元组。
s = pd.Series([1, 2, 3], ['a', 'b', 'c'])

我想要一个数组、列表、序列或可迭代对象:

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

2
那个 pd.Series() 调用实际上将 ['a', 'b', 'c'] 设为了索引,将 [1, 2, 3] 设为了数据,这可能不是你期望的结果。但是你的示例表明你想要先有 1、2、3 成为索引。list(s.items()) 返回 [('a', 1), ('b', 2), ('c', 3)]。所以这似乎是你需要的;也许你只需要在声明中翻转索引和数据。 - smci
3个回答

63

看起来很简单,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'))

4
应该写成list(zip(s,s.index)),否则在Python3中会得到一个zip对象。 - Claudiu Creanga
这里返回了一个zip对象,他正在请求一个元组。 - Seymour
1
@Seymour 发帖时,我只有 Python-2 的访问权限,因此错过了那个机会。现在已经编辑修复了 Python3 环境下的问题。 - Divakar

34
使用s.items()
(编辑:在pandas 1.5中,也有一个{{link1:s.iteritems()}},就像在Python 2中一样,区别在于iteritems()返回一个迭代器,而items()返回一个列表。要将输出作为列表而不是迭代器获取,可以使用:list(s.items())

9
一种可能的方法是交换索引元素和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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接