看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Series 除了具有当 NumPy 的特性之外,它还具有 Python 内置的字典的相关的一些特性。它实现了类似于字典的一些行为和方法。今天我们会介绍一下它的字典特性,所谓的 dict-like。
首先我们导入 pandas 库,别名为 pd,我们定义一个这样的 Series,它的值是 1、3、5,它的索引为 a、b、c。
import pandas as pd
ser = pd.Series([1, 3, 5],
index=['a', 'b', 'c'])
ser
'''
a 1
b 3
c 5
dtype: int64
'''
我们知道字典可以单独的获取它的键或者值,那 Series 同样也支持。我们可以通过 index 获得它的键,就是所谓的索引。
ser.index
# Index(['a', 'b', 'c'], dtype='object')
也可以通过 values 获得它的值,就是 Series 的值:
ser.values
# array([1, 3, 5])
我们还可以通过标签的值来获得标签所对应的数值,
ser['a']
# 1
ser['d']
# ...
# KeyError: 'd'
这里得到 a 的对应的值。如果没有标签内容,则抛出 KeyError 错误。
还可以通过属性的方法访问属性得到标签的对应的值:
ser.a
# 1
ser.d
# AttributeError: 'Series' object has no attribute 'd'
那如果遇到一个没有的标签值,它会报错。
字典还有一个 get() 方法可以获得对应的键的值,如果无此键可以设置缺省值。我们也可以用 Series 的 get() 方法获得对应键的值。我们在这里获取 b 对应的值得到了 3:
ser.get('b')
# 3
获取不存在的键 d:
ser.get('d') # 无返回
# None
ser.get('d', 7)
# 7
如果说传入一个不存在的标签,那它会返回一个我们设置的默认值,如果没有设置就返回 None。
字典有一个 pop() 方法可以删除指定键的值,Series 同样也实现了一个 pop() 方法。
ser
'''
a 1
b 3
c 5
dtype: int64
'''
ser.pop('a')
# 1
ser
'''
b 3
c 5
dtype: int64
'''
用 pop() 删除原 Series 标签 a 的值,ser 就就只剩下后两项了。 删除操作会返回被删除项的值,
我们打出我们的 Series 已经删除了 a 和 a 的值整项。它返回了我们删除后的内容。和字典里面的 pop() 方法一样,它是一个原地操作,它不会返回一个新的对象,而是将原对象进行了修改。
字典可以获取键,进行重新赋值来修改字典的内容,那 Series 也可以这样进行修改。
我们比如说数据当中修改 a 的值,我们把 a 修改为 10,重新打印出 Series 发现 a 的值已经变化。
ser
'''
a 1
b 3
c 5
dtype: int64
'''
ser.a = 10
ser
'''
a 10
b 3
c 5
dtype: int64
'''
可以用获取属性值的方法去获取并修改,我们在这里修改 c 的值,把 c 的值修改成 50:
ser['c'] = 50
ser.c = 50
ser
'''
a 10
b 3
c 50
dtype: int64
'''
打印发现 c 的值已经修改为 50。
字典支持成员检测,就是说一个值是否在一个字典中,我们 Series 呢同样也是支持成员检测:
ser
'''
a 1
b 3
c 5
dtype: int64
'''
5 in ser
# False
'a' in ser
# True
以上代码发现,这和我们字典一样,它在检测成员的时候检测它的键是否在存在。如果想检测值是否存在得取 Series 的 values 进行检测:
5 in ser.values
# True
对字典进行迭代,默认迭代它的键,那 Series 的迭代的是 Series 的值:
for i in ser:
print(i)
'''
1
3
5
'''
如果要迭代所有的内容,同时可以使用类似字典的 items() 方法:
for i,v in ser.items():
print(i, v)
'''
a 1
b 3
c 5
'''
迭代出了索引标签和取值。
字典呢有一个 update() 方法它可以更新字典的内容,Series 同样也实现了一个 update() 方法。
我们假定在原始的 series 是这样子的:
ser = pd.Series([1, 3, 5],
index=['a', 'b', 'c'])
ser
'''
a 1
b 3
c 5
dtype: int64
'''
然后再定义一个新的 Series:
ser_update = pd.Series([2, 4, 6],
index=['a', 'b', 'c'])
ser_update
'''
a 2
b 4
c 6
dtype: int64
'''
它们的索引标签值相同,取值不同,接下来用 update() 来更新:
ser.update(ser_update)
ser
'''
a 2
b 4
c 6
dtype: int64
'''
没有返回内容,这是一个原地操作,将原 ser 更新为 ser_update 的值。
如果说给一个没有标签的可迭代对象,它并不能进行修改:
ser.update([3, 4, 6])
ser
'''
a 2
b 4
c 6
dtype: int64
'''
这是因为传入的可迭代对象会强制转为 Series,索引的标签默认为 0-n,与原 Series 无法对齐匹配,故不做更新。
我们重新定义一个未定义索引的 Series,可以和给定的列表做更新操作,同时,如果我们想在一些位置上不做更新可以用 None 占位。
ser1 = pd.Series([1, 3, 5])
ser1
'''
0 1
1 3
2 5
dtype: int64
'''
ser1.update([10, None, 50])
ser1
'''
0 10
1 3
2 60
dtype: int64
'''
字典属于 Python 内置的映射类型,可将对应的值修改为它映射的值。那 Series 也是有类似的行为特征。
假定我们有这样的一个 Series,名称为 ser,它的索引是 a、b、c,还有另外一个 Series,名称为 ser2,索引为自然索引,值为 a、b、c,如下:
ser = pd.Series([1, 3, 5],
index=['a', 'b', 'c'])
ser
'''
a 1
b 3
c 5
dtype: int64
'''
ser2 = pd.Series([*'abc'])
'''
0 a
1 b
2 c
dtype: object
'''
我们将 ser2 中值 a、b、c 替换成 ser 它标签对应的值,这里可以用 map() 方法来做这个映射。
ser2.map(ser)
'''
0 1
1 3
2 5
dtype: int64
'''
关于 map() 方法的使用,可以关注我们后续的关于 pandas 数据结构应用函数的教程。
今天 Series 的字典特性就介绍到这里。
(完)
更新时间:2022-08-31 15:24:32 标签:pandas series dict 字典