68_Pandas.Series 索引和值的交换
将解释如何交换 pandas.Series 的索引(标签)和值。
以下面的 pandas.Series 为例。导入timeit模块来测量处理速度。
import pandas as pd
import timeit
s = pd.Series(['a', 'b', 'c', 'd', 'e'])
print(s)
# 0 a
# 1 b
# 2 c
# 3 d
# 4 e
# dtype: object
下面对内容进行说明。
- 通过交换构造函数中的索引和值来指定它们
- 使用和不使用values属性的速度对比
通过交换构造函数中的索引和值来指定它们
由于 pandas.Series 没有交换索引和值的方法,因此在构造函数 pandas.Series() 的第一个参数 data 和第二个参数索引中分别指定原始 pandas.Series 的索引和值,并创建一个新的 pandas.Series.generate.
s_swap = pd.Series(s.index.values, s.values)
print(s_swap)
# a 0
# b 1
# c 2
# d 3
# e 4
# dtype: int64
这里使用 pandas.Series 及其索引值属性(NumPy 数组 numpy.ndarray)。
print(s.values)
# ['a' 'b' 'c' 'd' 'e']
print(type(s.values))
# <class 'numpy.ndarray'>
print(s.index.values)
# [0 1 2 3 4]
print(type(s.index.values))
# <class 'numpy.ndarray'>
不使用values属性按原样指定也可以得到相同的结果,但使用values属性会稍微快一些(稍后介绍)。
s_swap = pd.Series(s.index, s)
print(s_swap)
# a 0
# b 1
# c 2
# d 3
# e 4
# dtype: int64
使用和不使用values属性的速度对比
使用timeit模块比较使用和不使用values属性的速度。
使用如下所示的values属性会更快。
loop = 10000
result = timeit.timeit(lambda: pd.Series(s.index.values, s.values), number=loop)
print(result / loop)
# 8.694580160081386e-05
result = timeit.timeit(lambda: pd.Series(s.index, s), number=loop)
print(result / loop)
# 0.00010916587258689105
即使原始 pandas.Series 的尺寸很大,也是如此。
s_large = pd.concat([s] * 100000)
print(len(s_large))
# 500000
loop = 100
result = timeit.timeit(lambda: pd.Series(s_large.index.values, s_large.values), number=loop)
print(result / loop)
# 0.005923357829451561
result = timeit.timeit(lambda: pd.Series(s_large.index, s_large), number=loop)
print(result / loop)
# 0.006492725329007953
但是,除非您有一个非常大的 pandas.Series,否则不会花那么长时间,因此您可以使用或不使用 value 属性。