深入掌握 Pandas 中 Series 基础功能:索引定制、数据排序与函数映射

153 阅读6分钟

本篇文章将主要介绍 Pandas 库中 Series 对象的基础方法,通过学习掌握这些基础方法,我们可以高效地进行数据预处理、计算等操作,为后续的数据分析打下坚实的基础。

1、创建 Series

最简单的创建 Series 序列可以仅仅由一个数组形成,如下生成 Series 数组的索引在左边,值在右边。

import pandas as pd
obj = pd.Series([1, 3, 5, 7])
obj

# ----输出----
# 0    1
# 1    3
# 2    5
# 3    7
# dtype: int64

从上看到,由于我们不为数据指定索引,默认生成的索引是从 0 到 N-1(N 是数据的长度),当然我们可以传入一个指定的索引序列,用标签标识每个数据点。

import pandas as pd
obj = pd.Series([1, 3, 5, 7], index=['a','b','c','d'])
obj

# ----输出----
# a    1
# b    3
# c    5
# d    7
# dtype: int64

当然,如果我们已经有数据包含在 Python 字典中,你可以使用字典生成一个 Series

import pandas as pd
scores = {'class1':60, 'class2':70, 'class3':80, 'class4':90}
obj = pd.Series(scores)
obj

# ----输出----
# class1    60
# class2    70
# class3    80
# class4    90
# dtype: int64

2、重建索引

reindex 是 Series 对象的重要方法,该方法用于创建一个符合新索引的新对象。Series 调用 reindex 方法时,会将数据按照新的索引进行排列,如果某个索引值之前并不存在,则会引入缺失值:

import pandas as pd
obj = pd.Series([3, 5, 7, 1], index=['b','c','d','a'])
obj
# ----输出----
# 0    3
# 1    5
# 2    7
# 3    1
# dtype: int64

obj2 = obj.reindex(['a','b','c','d','e'])
obj2
# ----输出----
# a    1.0
# b    3.0
# c    5.0
# d    7.0
# e    NaN
# dtype: float64

如果我们需要在重建索引时,对缺失值进行填充,则可以使用可选参数 method,其中 method 支持向前填充和向后填充:

  • 'ffill' :向前填充,使用前一个有效值填充缺失值。
  • 'bfill' :向后填充,使用后一个有效值填充缺失值。

如下是使用 ffill 的一个例子,特别注意如果你的索引不是升序或者降序时,需要先根据索引进行排序,或者会报以下错误

ValueError: index must be monotonic increasing or decreasing

obj3 = obj.sort_index().reindex(['a','b','c','d','e'], method='ffill')
obj3

# ----输出----
# a    1
# b    3
# c    5
# d    7
# e    7
# dtype: int64

3、轴向上删除条目

我们可以使用 drop 方法在轴向上删除一个或多个数据,返回一个新对象

import pandas as pd
obj = pd.Series([1, 3, 5, 7], index=['a','b','c','d'])
obj
# ----输出----
# a    1
# b    3
# c    5
# d    7
# dtype: int64

obj2 = obj.drop('c')
obj2
# ----输出----
# 0    1
# b    3
# d    7
# dtype: int64

obj3 = obj.drop(['a', 'c'])
obj3
# ----输出----
# 0    1
# b    3
# d    7
# dtype: int64

当然,如果我们想在原对象上操作,可以设置 inplace 参数

obj.drop('c', inplace=True)
obj

# ----输出----
# 0    1
# b    3
# d    7
# dtype: int64

4、获取数据

Series的索引(obj[...])与 NumPy 数组索引的功能类似,只不过 Series 的索引值可以不仅仅是整数。相关示例如下:

import pandas as pd
obj = pd.Series([1, 3, 5, 7], index=['a','b','c','d'])

obj['b']
# ----输出----
# 3

obj[1]
# ----输出----
# 3

obj[1:3]
# ----输出----
# 3    5
# 4    7
# dtype: int64

obj['a': 'c']
# ----输出----
# 0    1
# 1    3
# 2    5
# dtype: int64

obj[['a', 'c']]
# ----输出----
# 0    1
# 2    5
# dtype: int64

obj[[1, 3]]
# ----输出----
# 1    3
# 3    7
# dtype: int64

obj[obj < 2]
# ----输出----
# a    1
# dtype: int64

在 Series 对象使上用整数索引对用户来说经常会产生歧义,这是因为它和在列表、元组等 Python 内建数据结构上进行索引有些许不同。例如,对于以下的 Series 序列,obj[1] 中 1 是表示使用索引还是使用整数下标,会有歧义

import pandas as pd
obj = pd.Series([1, 3, 5, 7], index=[1,2,3,4])
obj[1]

为了更精确地处理,可以使用 loc(用于标签)或 iloc(用于整数):

import pandas as pd
obj = pd.Series([1, 3, 5, 7], index=[1,2,3,4])
obj.loc[1]
# ----输出----
# 1

# obj.iloc[1]
# ----输出----
# 3

5、算术计算

不同 Series 索引的对象之间的数值计算是根据索引对齐计算,如果存在某个索引对不相同,则返回结果的索引将是索引对的并集。如下所示

import pandas as pd
s1 = pd.Series([1, 3, 5, 7], index=['a','b','c','d'])
s2 = pd.Series([2, 4, 6, 8], index=['a','c','d','e'])

s1 + s2

# ----输出----
# a     3.0
# b     NaN
# c     9.0
# d    13.0
# e     NaN
# dtype: float64

没有交叠的标签位置上,内部数据对齐会产生缺失值,缺失值会在后续的算术操作上产生影响。我们可以使用 add 实现同样的相加效果,而且有参数 fill_value 可以在相加时指定缺失值的替代值。

import pandas as pd
s1 = pd.Series([1, 3, 5, 7], index=['a','b','c','d'])
s2 = pd.Series([2, 4, 6, 8], index=['a','c','d','e'])

s1.add(s2, fill_value=0)

# ----输出----
# a     3.0
# b     3.0
# c     9.0
# d    13.0
# e     8.0
# dtype: float64

当然除了,以上介绍的 add 方法外,还有以下算术方法,我们就不再分别介绍,大家根据需要使用即可。

6、函数映射

我们可以通过 map 方法将一个函数应用于 Series 的每个元素,例如,将每个元素乘以 2:

import pandas as pd

s = pd.Series([1, 2, 3, 4])

# 使用 map 方法将每个元素乘以 2
result = s.map(lambda x: x * 2)
result

# ---- 输出 ----
# 0    2
# 1    4
# 2    6
# 3    8
# dtype: int64

7、排序

Series 可以使用 sort_index 方法根据标签进行排序,该方法返回一个新的、排序好的对象:

import pandas as pd
s1 = pd.Series([1, 3, 5, 7], index=['b','c','d','a'])
s1.sort_index()

# ---- 输出 ----
# 0    1
# a    7
# b    3
# c    5
# d    7
# dtype: int64

数据默认会根据标签升序排序,但是也可以通过设置 ascending 参数按照降序排序:

s1 = pd.Series([1, 3, 5, 7], index=['b','c','d','a'])
s1.sort_index(ascending=False)

# ---- 输出 ----
# d    5
# c    3
# b    1
# a    7
# dtype: int64

如果要根据 Series 的值进行排序,使用 sort_values 方法:

s1 = pd.Series([1, 3, 5, 7], index=['b','c','d','a'])
s1.sort_values()

# ---- 输出 ----
# b    1
# c    3
# d    5
# a    7
# dtype: int64

8、统计方法

Series 对象装配了一个常用数学、统计学方法的集合。其中大部分属于归约或汇总统计的类别。与 NumPy 数组中的类似方法相比,它们内建了处理缺失值的功能。如下我们看 Series 对象的 sum 方法的一个例子,如下所示

import pandas as pd
import numpy as np

s1 = pd.Series([1, 3, np.nan, 7], index=['b','c','d','a'])
s1.sum()

# ---- 输出 ----
11.0

我们再来看两个间接统计的例子,比如 idxmin 和 idxmax,返回的是间接统计信息,比如最小值或最大值的索引值

s1.idxmax()
# ---- 输出 ----
# 'a'

s1.idxmin()
# ---- 输出 ----
# 'b'

当然如果我们要看整个数据集的基本信息,我们可以使用 describe 来描述数据集的基本信息

s1.describe().round(2)

# ---- 输出 ----
# count    3.00
# mean     3.67
# std      3.06
# min      1.00
# 25%      2.00
# 50%      3.00
# 75%      5.00
# max      7.00
# dtype: float64

其它统计及其相关方法的使用方式类似,我们不分别举例,进行汇总完整列表如下

如果你喜欢本文,欢迎点赞,并且关注我们的微信公众号:Python技术极客,我们会持续更新分享 Python 开发编程、数据分析、数据挖掘、AI 人工智能、网络爬虫等技术文章!让大家在Python 技术领域持续精进提升,成为更好的自己!

添加作者微信(coder_0101),拉你进入行业技术交流群,进行技术交流~