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

Posted

技术标签:

【中文标题】如何将熊猫系列转换为索引和值的元组【英文标题】:how to convert pandas series to tuple of index and value 【发布时间】:2016-11-22 22:33:28 【问题描述】:

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

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

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

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

【问题讨论】:

pd.Series() 调用实际上使['a', 'b', 'c'] 成为索引,[1, 2, 3] 成为数据,而不是您所期望的。但是您的示例表明您首先希望 1,2,3 成为索引。 list(s.items())[('a', 1), ('b', 2), ('c', 3)]。所以这似乎是你所需要的;也许你只需要在声明中翻转索引和数据。 【参考方案1】:

一种可能性是交换索引元素的顺序和来自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

【讨论】:

【参考方案2】:

看来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'))

【讨论】:

应该是 list(zip(s,s.index)) 否则你会在 python3 中得到一个 zip 对象 这会返回一个他要求tuple的zip对象 @Seymour 在发帖时,我可以访问 Python-2,所以错过了。已针对 python3 场景进行了编辑。【参考方案3】:

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

(如果您想将输出作为列表而不是迭代器,请执行:list(s.items())

【讨论】:

以上是关于如何将熊猫系列转换为索引和值的元组的主要内容,如果未能解决你的问题,请参考以下文章

Python3基础 list enumerate 将列表的每个元素转换成 带索引值的元组

Python3基础 list enumerate 将列表的每个元素转换成 带索引值的元组

在 Clojure 中将元组数组转换为哈希映射

Python3基础 list(enumerate()) 将一个列表的每一个元素转换成 带索引值的元组

PySpark Dataframe 将两列转换为基于第三列值的元组新列

MDX:如何将具有多个成员的元组转换为具有单个成员的元组?