4.2 Series和DataFrame对象的查、改、增、 删
In [1]:
import numpy as np import pandas as pd
对series和dataframe的常用操作是查询数据(索引数据)、修改、增加和删除数据,下面就分别介绍这些操作:
4.2.1. Series的查、改、增、 删
4.2.1.1 查
In [2]:
mylist = list('abcdef') # 列表作为索引 myarr = np.random.randint(12,size=6) s = pd.Series(data=myarr,index=mylist) s
Out[2]:
a 0 b 2 c 11 d 11 e 1 f 9 dtype: int32
查的方法:loc方法、iloc方法、[]操作符
最常用的索引方法可能就是这三类,其中iloc表示位置(下标)索引,loc表示标签索引,[]则两者都可以,既可以用下标索引也可以用标签索引。
[]
,快捷查看
索引下标为标量, 返回一个值
In [3]:
s[2]
Out[3]:
11
下标的切片是左闭右开,最后一个索引不包括其中,类似于numpy数组切片,结果仍然是series。
In [4]:
s[2:5]
Out[4]:
c 11 d 11 e 1 dtype: int32
标签索引,单个标签索引返回该标签对应的数据。
In [5]:
s['e']
Out[5]:
1
标签的切片操作是左闭右闭,即包含最后一个索引,结果仍然是series。
In [6]:
s['c':'e']
Out[6]:
c 11 d 11 e 1 dtype: int32
整型数组索引:
In [7]:
s[[0,2]]
Out[7]:
a 0 c 11 dtype: int32
布尔索引:
In [8]:
s1 = s[2:5] s1
Out[8]:
c 11 d 11 e 1 dtype: int32
In [9]:
mask = [False,True,True] s1[mask]
Out[9]:
d 11 e 1 dtype: int32
- loc方法:
.loc[]
,基于标签索引
.loc[]通过索引的标签查询对应的值
In [10]:
s.loc['d'] # 单索引,返回一个值
Out[10]:
11
loc的切片操作是左闭右闭,也就是包含了结束标签的取值,返回Series切片。
In [11]:
s.loc['a':'d']
Out[11]:
a 0 b 2 c 11 d 11 dtype: int32
上面结果返回了d索引值,同s['a':'d']
In [12]:
s.loc[['d','f']] # 整型数组索引,返回Series
Out[12]:
d 11 f 9 dtype: int32
布尔索引:
In [13]:
s2 = s.loc['a':'d'] s2
Out[13]:
a 0 b 2 c 11 d 11 dtype: int32
In [14]:
mask = [False, True, False,True] # 布尔索引,返回Series类型 s2.loc[mask]
Out[14]:
b 2 d 11 dtype: int32
- iloc方法:
.iloc[]
,基于位置即下标的索引
In [15]:
s.iloc[3] # 单个元素的下标索引,返回下标对应的值
Out[15]:
11
范围,左闭右开,返回Series切片,同s[2:5]
In [16]:
s.iloc[2:5]
Out[16]:
c 11 d 11 e 1 dtype: int32
In [17]:
s.iloc[[2,5]] #列表索引即整型数组索引,返回Series类型
Out[17]:
c 11 f 9 dtype: int32
In [18]:
s3 = s.iloc[2:5] s3
Out[18]:
c 11 d 11 e 1 dtype: int32
In [19]:
mask = [False,True,False] #布尔数组索引,返回Series类型 s3.iloc[mask]
Out[19]:
d 11 dtype: int32
4.2.1.2 改
- 改值 直接在索引操作的基础上赋值即可
In [20]:
s[2] = 333 s
Out[20]:
a 0 b 2 c 333 d 11 e 1 f 9 dtype: int32
In [21]:
s['f'] = 555 s
Out[21]:
a 0 b 2 c 333 d 11 e 1 f 555 dtype: int32
In [22]:
s.loc['c':'e'] = [100,400,500] s
Out[22]:
a 0 b 2 c 100 d 400 e 500 f 555 dtype: int32
- 改索引
直接在index上改,index类似于tuple,只能引用到别处,不能切片修改
In [23]:
s4 = s[2:5] s4
Out[23]:
c 100 d 400 e 500 dtype: int32
In [24]:
s4.index = ['aa','ee','ff'] s4
Out[24]:
aa 100 ee 400 ff 500 dtype: int32
通过函数修改索引:Series.rename(index=None, level = None, inplace = False)
- index:list or dict,list类型时必须和已有索引长度相同,dict类型可以部分修改;
- level:多重索引时,可以指定修改哪一重,从0开始递增;
- inplace:是否修改原Series,默认为False,即不修改。
In [25]:
s5 = s[2:5] s5
Out[25]:
c 100 d 400 e 500 dtype: int32
In [26]:
s5.rename(index = {'e':'bb','a':'zz'}, inplace = True)
In [27]:
s5
Out[27]:
c 100 d 400