在对pandas基本结构有了大概的认识后,我们接下来要开始上手,学习如何在这些结构上进行创建,修改,添加,删除,查找等操作。首先我们开始学习Series结构。
一. 创建一个Series
创建一个最基本的Series结构,代码如下:
s = pd.Series(data, index=index)
data是数据值,是可选参数,不填则创建空Series对象;index是自定义的索引列表,是可选择参数,默认是从0开始的递增序列。其中,data可以是很多类型:
-
数组型结构(列表,元组,ndarray等)
此时若要自定义index,则index长度必需和数组长度一致。
s=pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
-
字典结构
若不指定index,则字典中的key作为索引,value作为数据值;若指定了索引,则会发生数据对齐(无论什么时候,索引与数据都是对应的,除非人为的改变他们,如果出现了新的索引,那么数据值将为空)。
dict = {'a':0, 'b':1, 'c':2}
s=pd.Series(dict, index=['b','c','d', 'a'])
Out[11]:
b 1
c 2
d NaN
a 0
dtype: float64
-
标量值(数字,字符串)
若不指定index,则会创建只有一个元素的series;若指定了index,那么所有索引对应的数据值都是该标量。
s=pd.Series('apple',index=[1,2,3,4])
print(s)
Out[12]:
1 apple
2 apple
3 apple
4 apple
dtype: object
二. 增加元素
在创建好的Series对象中添加元素,常见的有2种方案:
- 直接赋值:
s['e']=12
这种方法有风险,若原Series中已经存在索引e,则e对应的数据值将被改为12,;若不存在索引e,则添加新索引和数据。
- append()函数
append()函数是Series的成员函数,用于连接2个Series对象,该函数会返回一个新的合并后的对象,且不改变原Series。
pandas.Series.append(to_append, ignore_index=False, verify_integrity=False)
- to_append:目标Series
- ignore_index: True为重新构建索引,False则保留原Series索引(可能会重复)
- verify_integrity:True为检测合并后是否有索引冲突,存在则报错
s=pd.Series([1,2,3,4])
s=s.append(pd.Series(5,index=[2]),ignore_index=True)
print(s)
Out[13]:
0 1
1 2
2 3
3 4
4 5
三. 删除元素
- python的del语句
直接通过索引删除。
s=pd.Series([1,2,3,4])
del s[3]
print(s)
Out[14]:
0 1
1 2
2 3
dtype: int64
- Series的pop()函数
弹出某个索引的值,并将其删除。
Series.pop(index) #index是索引,只能是一个值,不能是序列
该函数是Series的成员函数,它会返回索引位置的值,然后将其从Series中删除,若索引不存在,则会报错。
- Series的drop()函数
根据索引批量删除数据,但不会改变原函数。
s=pd.Series([1,2,3,4])
s1=s.drop([2,3])
print(s)
print(s1)
Out[15]:
0 1
1 2
2 3
3 4
dtype: int64
0 1
1 2
dtype: int64
四. 修改元素
- 通过索引直接修改
可以通过索引直接修改元素,或者通过切片批量修改元素。
s=pd.Series([1,2,3,4])
s[0]=6
s[1:3]=12
print(s)
Out[16]:
0 6
1 12
2 12
3 4
dtype: int64
- update()函数
pandas.Series.update(other_s)
该函数是Series成员函数,它通过其他Series来更新自身。更新操作只会更新那些,原Series与other_s中共有的索引。other_s中其余的值不会被插入到原Series中。
举个例子:
s = pd.Series(['a', 'b', 'c'])
s.update(pd.Series(['d', 'e'], index=[0, 2]))
Out[17]:
0 d
1 b
2 e
dtype: object
若other_s中共同索引对应的值为nan,那么将不会被更新到原索引中。
s = pd.Series([1, 2, 3])
s.update(pd.Series([4, np.nan, 6]))
Out[18]:
0 4
1 2
2 6
dtype: int64
五. 查找与索引
PANDAS是基于Numpy设计的,所以保留了Numpy访问数组的方法,常用的索引操作方式主要包括:
- 点字符‘ . ’(Series属性)
- 中括号[ ]
- loc
- iloc
(一)点字符
Series可以使用 ‘. 索引’ 的方法直接访问值。前提是索引标签符合Python命名标准(比如s.1就是不合法的),同时不能与函数名,保留字等发生冲突。
s=pd.Series([1,2,3],index=['a','b','c'])
print(s.b)
(二)中括号
Series利用中括号索引时,常见的输入主要包括以下几种。注意,当我们定义的索引标签为数字时,会与位置下标发生歧义,所以在使用中括号访问数据时,我不推荐使用位置下标,都使用索引标签,避免发生歧义。pandas为了解决这种歧义,不推荐使用中括号访问数据,取而代之的是使用基于索引标签的loc,与基于位置下标iloc,后面我们会来学习。
- 位置下标
- 索引标签
- 位置/标签序列
- 切片
- 布尔型
- 函数
- 位置下标与标签索引
s=pd.Series([1,2,3],index=['a','b','c'])
print(s[0]) #位置下标从0开始
print(s['b'])
Out[18]:
1
2
- 位置/标签序列索引
s=pd.Series([1,2,3],index=['a','b','c'])
print(s[['a','c']])
Out[20]:
a 1
c 3
- 切片
这里需要注意,与Python语法不同,索引标签切片,包含尾部;位置切片与Python语法相同,不包含尾部。
s=pd.Series([1,2,3],index=['a','b','c'])
print(s['a':'c'])
print(s[0:2])
Out[21]:
a 1
b 2
c 3
a 1
b 2
dtype: int64
- 布尔型索引
s=pd.Series([1,2,3],index=['a','b','c'])
print(s[(s>1) & (s<3)])
Out[22]:
b 2
- 函数
s=pd.Series([1,2,3,4])
print(s[lambda x:x>2])
Out[22]:
2 3
3 4
(三)基于标签的loc方法(推荐)
使用loc方法进行数据访问时,必须严格使用索引标签,否则会报错,数字索引标签是支持的,但是数字一定会被理解为标签,而不是位置。如果要访问的索引标签在数据中不存在,也会被报错。
使用loc时的输入如下,使用方法和中括号相似:
- 索引标签
- 标签序列
- 切片
- 布尔型
- 函数
切片索引时要注意:
与Python语法不同,标签切片,左闭右闭;位置切片,左闭右开。所以,loc的切片都是左闭右闭。
s=pd.Series([1,2,3],index=['a','b','c'])
print(s.loc['a':'b'])
Out[25]:
a 1
b 2
dtype: int64
(四)基于位置的iloc方法(推荐)
iloc方法与loc方法很类似,区别在于iloc仅支持位置下标索引,否则报错,下标位置从0开始。
使用iloc时的输入如下,使用方法和中括号相似:
- 位置下标
- 位置序列
- 切片
- 布尔型
- 函数
切片索引时要注意:
与Python语法不同,标签切片,左闭右闭;位置切片,左闭右开。所以,iloc的切片都是左闭右开。
六.Series最主要的性质:自动对齐
Series和其他数组最关键的区别在于,Series间的操作会自动根据标签对齐数据。因此,你可以直接编写计算,而不用考虑所涉及到的Series是否具有相同的标签。
s=pd.Series([1,2,3],index=['a','b','c'])
s1=pd.Series([2,4,6],index=['a','b','d'])
print(s+s1)
Out[27]:
a 3.0
b 6.0
c NaN
d NaN
dtype: float64
可以看到,相同索引的值进行了相加运算,没有匹配的索引被引入了空值nan。
网友评论