一. 索引详解
标签索引与位置索引
如果Series对象的index值为非数值类型,通过[索引]访问元素,索引既可以是标签索引,也可以是位置索引。这会在一定程度上造成混淆。我们可以通过:
- loc 仅通过标签索引访问。
- iloc 仅通过位置索引访问。
这样,就可以更加具有针对性去访问元素。
整数数组索引与布尔数组索引
Series也支持使用整数数组与布尔数组进行索引。与Numpy数组相同,二者返回的是原数组数据的拷贝(复制)。
说明:
- 与ndarray数组的整数索引不太相同,Series的整数数组索引,既可以是标签数组索引,也可以是位置数组索引。
# 当Series的索引(index)是数值类型时,此时,只能通过标签索引访问元素。
# 当Series的索引时非数值类型时,此时,既可以通过标签索引访问元素,也可以通过位置索引访问元素。
# 这会造成极大的混淆。因此,不建议使用s[索引]的方式访问元素。
# s = pd.Series([23, 12, 33], index=[5, 6, 7])
s = pd.Series([23, 12, 33], index=["a", "b", "c"])
# s["a"]
# s[-1]
# 建议:使用loc与iloc访问元素。
# loc 仅针对标签索引访问元素。
# iloc仅针对位置索引访问元素。
# s.loc["a"]
# 错误,loc仅能通过标签索引访问元素。
# s.loc[0]
# s.iloc[-1]
# 错误,iloc仅能通过位置索引访问元素。
# s.iloc["a"]
# s.ix与s[索引]的方式类似,表示先根据标签索引访问元素,如果找不到,再根据位置索引访问元素。
# s.ix 已经不建议使用。
# s.ix["a"], s.ix[-1]
特别注意,用的时候会有混淆
会出错
提供index a
这时候可以了吗?
原因在于index到底是数值类型还是非数值类型。
如果是非数值类型,
既可以通过标签索引来访问元素,也可以通过位置索引来访问元素。
所以,不建议。
更好的方法,区分开来 标签索引 位置索引。
通过
Loc 位置 Iloc 标签
混淆:标签和位置 都能访问。
希望能有一致性,Loc 只能标签索引。
Loc 如果位置索引,会报错。
Loc仅能通过标签索引。
s.iloc只能位置,标签就会报错。
负值也支持。
老代码 s.ix,
还有,老代码 s.ix,
警告信息: 不建议使用。
标签数组索引,基于标签进行访问
整数数组索引 布尔数组索引
通过标签进行访问
通过位置来访问,也支持
以上就是通过索引数组获取元素,必须是通过 标签索引。
s = pd.Series([23, 12, 33], index=["a", "b", "c"])
# 通过索引数组获取元素。
# s[["a", "b"]]
# s[[0, 2]]
# s[s > 12]
# 通过索引数组获取元素,返回的是原数组对象(Series)的拷贝。这点与ndarray相同。
s2 = s[["a", "b"]]
s.loc["a"] = 300
print(s)
print(s2)
布尔数组索引
返回布尔
返回过滤结果
类数组对象就可以,并非一定是要严格ndarray。
修改值
索引获取,返回拷贝
二. 切片详解
Series也支持切片访问一个区间的元素。与Numpy的数组相同,切片返回的是原数组数据的视图。
Series的切片与Numpy的ndarray数组对象切片是否存在不同?
能是能,
但是有歧义,既可以通过标签,也可以通过位置。
位置索引 起包 终 不包
标签索引 起 终 都包含
Ndarray永远基于位置索引访问
s = pd.Series([23, 12, 33], index=["a", "b", "c"])
# Series支持切片,不建议这样使用。建议使用loc与iloc。
# s[0:2]
# Series切片返回的是原Series对象的视图。一个对象修改了,将会另外一个对象造成影响。
# s2 = s.iloc[0:2]
# s.iloc[0] = 1000
# print(s)
# print(s2)
S修改之后,s2也改变
Series切片返回的时原series对象的视图,一个对象修改了,会对另外一个对象造成影响
# Series与ndarray都支持切片操作,但是,二者的切片行为是存在差异的。
# 对于ndarray,是基于位置进行切片的。(没有标签索引)
# 对于Series,既可以根据标签索引进行切片,也可以根据位置索引进行切片。
s = pd.Series([23, 12, 33], index=["a", "b", "c"])
# 包含起始点,不包含终止点。
# s.iloc[0:2]
# 包含起始点,也包含终止点。
s.loc["a":"c"]
三. Series的CRUD操作
Series索引-数值CRUD操作:
- 获取值
- 修改值
- 增加索引-值
- 删除索引-值
s = pd.Series([1, 2, 3], index=["a", "b", "c"])
# 获取值,建议使用loc与iloc。
# s.loc["a"]
# s.iloc[0]
# 修改值
# s.loc["a"] = 100
# s.iloc[-1] = 300
# Series类似于字典的存储方式,因此,增加索引-值的方式与字典也是相同的。
# 增加与修改的语法是相同的。增加还是修改,完全取决于索引在Series当中是否存在,如果存在,则是修改,
# 如果不存在,则是增加。
# s.loc["d"] = 400
获取值 loc iloc
# 删除索引-值。
# del s["a"]
# 参数指定要删除的标签。如果需要删除多个标签,可以传递一个数组。
# s.drop("a")
# s.drop(["a", "b"])
# s.drop默认会返回新的对象,没有在原有的对象上进行修改。如果我们希望在原有的对象上进行修改(就地修改),
# 可以设置inplace参数(默认为False),将其设置为True。
# s = s.drop("a")
# s.drop("a", inplace=True)
# print(s)
# 注意:inplace为True的时候,方法返回值为None。如果inplace为False,则方法会返回修改之后的结果。
# s.drop("a", inplace=False)
删除操作
不去用,因为这是字典的方式。
如何去用?
s.drop()方法 传索引
传一个数组,删除多个。
想把s打印一下,有没有真的删除?
没有成功,s.drop一大堆,返回的都是新创建的对象,
如果想让它修改,还是得赋值回来。
在原有对象上修改,
如果不想赋值呢?想再原有对象上修改,怎么办?
设置implace参数,设置为true,Inplace 出现频率很高。
每个人都有擅长点,我想做bitalent。
修改成功了。
返回值没有 是none,Print就有 none。
Jn中 b会把a盖掉
Li.sort()没有返回值,
就地修改,想要的结果调用li就可以了,
没有返回值是因为访问li就行了。
Sorted(li) 新的创键一个对象,li不变,
Sorted也没返回值,就没有意义了。
Inplace = true 对s对象本身的修改
输出s就行了,
可以通过s获得修改后的结果。
False没有进行就地修改,如果又没有返回值 就没有意义
Pandas里面提供的方法,只要涉及到inplace,就是这个思想。