jjzjj

pandas 学习 第2篇:Series -(创建,属性,转换和索引)

悦光阴 2023-08-11 原文

序列是一维数组,只有一个维度(或称作轴)是行(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 Series

有关pandas 学习 第2篇:Series -(创建,属性,转换和索引)的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  5. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  6. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  7. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  8. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  9. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  10. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

随机推荐