68_Pandas.Series 索引和值的交换

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))
# 

print(s.index.values)
# [0 1 2 3 4]

print(type(s.index.values))
# 

不使用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 属性。

你可能感兴趣的:(Pandas,pandas,python,数据分析,机器学习,数据挖掘)