快捷搜索:  汽车  科技

pandas库中设置索引的方法(pandas学习第2篇Series-)

pandas库中设置索引的方法(pandas学习第2篇Series-)>>> data=np.array(['a' 'b']) # data=['a' 'b'] >>> sd=pd.Series(data) 0 a 1 b dtype: object分析序列的输出:使用ndarray的一维数组,或者list来构造序列,序列包含两部分:索引和序列值,如下所示pandas.Series(data=None index=None dtype=None name=None copy=False)构造函数的参数:索引的下标是自动生成的,从0开始,依次加1递增。对于序列的data,可以通过序列的属性values来访问;对于序列的索引,可以通过序列的属性index来访问。1,使用ndarray或list创建序列

序列是一维数组,只有一个维度(或称作轴)是行(row),在访问序列时,只需要设置一个索引。序列(Series)是由一组相同类型的数据,以及一组与之相关的行标签(索引)组成,序列要求存储的数据类型是相同的。

在创建序列时,如果没有设置索引,那么pandas自动为序列创建了一个从0开始到N-1的序号,称作行的索引。也可以显式设置index参数,为每行设置标签,pandas把标签称作索引。用户可以通过索引、也可以通过位置来访问Series对象中的元素。

序列可以看作是索引到数据值的一个映射,一个索引对应一个数据值,这种结构就是有序的字典。

一,创建序列

序列的构造函数定义是:

pandas.Series(data=None index=None dtype=None name=None copy=False)

构造函数的参数:

  • data:传递给序列的数据,可以是ndarray、list或字典
  • index:设置轴的索引,索引值的个数与data参数的长度相同。如果没有设置index参数,那么默认值是 np.arange(n),或者 RangeIndex (0 1 2 … n)。
  • dtype:设置序列元素的数据类型,如果没有设置,那么pandas将推断数据类型
  • name:序列的名称
  • copy:复制数据,默认值是false

索引的下标是自动生成的,从0开始,依次加1递增。对于序列的data,可以通过序列的属性values来访问;对于序列的索引,可以通过序列的属性index来访问。

1,使用ndarray或list创建序列

使用ndarray的一维数组,或者list来构造序列,序列包含两部分:索引和序列值,如下所示

>>> data=np.array(['a' 'b']) # data=['a' 'b'] >>> sd=pd.Series(data) 0 a 1 b dtype: object

分析序列的输出:

最左侧的0和1是行索引,a和b是数据值。

在构造序列时,如果没有传递index参数,默认情况下,pandas分配了从 0 len(data)-1 的索引。

2,显式传递index参数

在构造函数中传递自定义的索引列表,索引的长度必须和data的长度相同,如下所示:

>>> sd=pd.Series(data index=[101 102]) 101 a 102 b dtype: object

3,显式设置序列的name属性和index的name属性

序列是一维数组,只有一个维度,那就是row,在序列中为Index命名就是设置行轴的名称。

>>> sd=pd.Series(data=['a' 'b'] index=pd.Index([101 102] name='idx_name') name='series_name') idx_name 101 a 102 b Name: series_name dtype: object

序列看起来像多行一列的数据集,但是他们之间有本质的区别,多行一列是二维数组,有行名称和列名称,需要使用两个索引值来访问单个cell的数据,而序列只需要一个索引就可以访问元素值。

4,从字典构造序列

通过字典来创建Series,字典的key作为序列的索引标签,value作为对应Key的数据值:

>>> sdata = {'b': 12 'a': 13} >>> spd.Series(sdata) b 12 a 13 dtype: int64

通过字典构建的序列,索引是标签(字符类型)。

二,序列的属性

序列对象包含的属性:

  • index:序列的索引
  • shape:序列的形状,表示各个维度的数量
  • array:把序列的数据值转换为Pandas数组
  • values:把序列的数据值转换为numpy数组
  • dtype:序列元素的数据类型
  • hasnan:序列是否包含nan
  • is_unique:序列的元素是否是唯一的

1,序列的索引

>>> sd.index Int64Index([101 102] dtype='int64' name='idx_name')

2,序列的shape

>>> sd.shape (2 )

3,序列的PandasArray或ndarray数组

>>> sd.array <PandasArray> ['a' 'b'] Length: 2 dtype: object >>> sd.values array(['a' 'b'] dtype=object)三,序列数据的转换

转换序列数据值的类型:

Series.astype(self dtype copy=True errors='raise' **kwargs)

把序列转换为NumPy数组:

Series.to_numpy(self dtype=None copy=False)

把序列转换为list:

Series.to_list(self)四,访问序列的元素

序列元素的访问,可以通过索引和行标签,索引标签是在构造函数中通过index参数传递或构造的,而索引值(也可以称作序列的下标)是默认生成的,第一个元素的下标值是0,依次加1递增。

1,通过索引来访问序列

对于序列,通过索引来访问序列元素的格式是:Sereis[index],索引可以是整数,也可以是字符类型的标签:

>>> sd[102] 'b'通过属性来访问序列的元素值

2,at和iat属性,用于访问序列的单个元素值

at属性通过索引访问单个序列值

>>> sd.at[102] 'b'

iat属性表示通过位置访问序列的单个元素值:

>>> sd.iat[0] 'a'

3,loc和iloc,通过序列的位置来访问元素

iloc:基于整数位置的索引,用于按位置选择序列元素

  • 单个位置索引,比如sd.iloc[1]
  • 位置索引的列表,比如 sd.iloc[[0 1]]
  • 整数序列,比如,sd.iloc[0:2]
  • 布尔值数组,sd.iloc[[True False True False]]

loc:通过索引标签和布尔值数组来选择序列的元素

举个例子,通过整数位置来选择序列的元素:

>>> sd.iloc[0:2] idx_name 101 a 102 b Name: series_name dtype: object

举个例子,通过索引的标签来选择序列的元素:

>>> sd.loc[[101 102]] idx_name 101 a 102 b Name: series_name dtype: object

4,通过位置掩码(布尔索引数组)来访问序列的元素

在上面的例子中,[101 102] 称作索引数组,如果索引数据的元素类型是布尔类型,并且索引数组的元素数量和序列相同,那么把这种索引数组称作位置掩码。当位置为True时,表示选择该元素;当位置为False,表示不选择该元素。

>>> sd.loc[[True False]] idx_name 101 a Name: series_name dtype: object

5,获得懒惰迭代器

可以通过序列的__iter__()函数获得值的迭代器,也可以通过items()或iteritems()函数获得包含索引和值的元组的迭代器:

Series.__iter__(self) #Return an iterator of the values. Series.items(self) #Lazily iterate over (index value) tuples. Series.iteritems(self) #Lazily iterate over (index value) tuples.

例如,通过items()函数获得序列的迭代器,并通过for循环来打印序列的值

>>> for t in sd.items(): ... print(t) ... ('b' 12) ('a' 13) ('d' 14) ('c' 10)五,序列的条件索引

按照条件选择序列的特定行,可以使用序列的loc或iloc属性,并使用布尔索引来筛选序列的数据行:

>>> sd.loc[sd>12] a 13 d 14 dtype: int64

也可以使用逻辑表达式对条件进行组合计算:

>>> sd.loc[(sd>12) & (sd<14)] a 13 dtype: int64 >>> sd.loc[(sd>12) | (sd<14)] b 12 a 13 d 14 c 10 dtype: int64

注意,必须用小括号把两个逻辑表达式括起来,不然会报错:

ValueError: The truth value of a Series is ambiguous. Use a.empty a.bool() a.item() a.any() or a.all().

查看序列的逻辑表达式的值:

>>> (sd>12) & (sd<14) b False a True d False c False dtype: bool六,序列的基本操作

1,删除元素的元素

根据行标签删除指定的元素

Series.drop(self labels=None)

2,对序列元素执行条件查询

如果序列元素的值满足cond条件,返回other的值;如果不满足,返回元素的值。

Series.where(self cond other=nan inplace=False)

3,把序列追加到一个序列末尾

把to_append序列追加到序列的末尾,设置ignore_index表示忽略原始序列的索引,重新创建一个索引:

Series.append(self to_append ignore_index=False verify_integrity=False)

4,重索引

重索引是指按照新的索引对序列的元素进行重新排列,如果某个索引值不存在,就形成一个空洞,默认情况下,在空洞处插入缺失值:

Series.reindex(self index=None **kwargs)

参数 **kwargs 表示数据不固定的参数,其中有:

method:表示插补缺失值的方法,有效值有{None ‘backfill’/’bfill’ ‘pad’/’ffill’ ‘nearest’}

  • None 表示插入缺失值nan
  • ‘backfill’/’bfill’:表示使用空洞之后的最近的有效值来填充
  • ‘pad’/’ffill’:表示使用空洞之前的最近的有效值来填充
  • ‘nearest’:表示使用最靠近空洞的有效值来填充

fill_value:填充的值,默认值是nan

pandas库中设置索引的方法(pandas学习第2篇Series-)(1)

猜您喜欢: