本篇文章将主要介绍 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),拉你进入行业技术交流群,进行技术交流~