我们将从pandas的基本数据结构的快速简介的介绍开始,以帮助我们入门。数据结构、索引和轴标签/对齐的基本操作适用于所有对象。
我们首先导入numpy和pandas以开始我们的工作。
In [1]: import numpy as np In [2]: import pandas as pd
有一个基本原则需要记住:数据对齐是一个固有的内在操作。在标签和数据之间的关联不会被打破,除非你特意要这么做。
我们先简要介绍下pandas的数据结构,然后分类别讨论pandas的所有方法和功能。
Series
Series的创建
Series 是可以包含所有数据类型(整型、字符串、浮点型、python对象等)的带有标签的一维数组。行列轴标签被统称为index——索引。
下面这是创建一个Series的基本方法:
s = pd.Series(data,index=index)
data 可以是下面的任意一种:
-
python字典
-
numpy的ndarray
-
标量值(例如:5)
data为ndarray
如果data是ndarray,index索引必须是跟data等长度。如果没有指定index,那么将会默认生成[0,1,2,...,len(data)-1]的数值列表。
s = pd.Series(np.random.randn(5),index=list('abcde')) s.index pd.Series(np.random.randn(5))
注意:
pandas支持非唯一值的索引。如果你试图要做一个不支持重复值的索引操作,那么将会报出异常。
(这里还有一句话,没太理解什么意思,以后再来补充)
data为Python字典
可以通过Python字典来创建series
d = {'b':1,'a':0,'c':2} pd.Series(d)
注意:
NaN 是pandas中标准处理缺失值的方式
data为标量值
如果data为标量值,那么index必须给出。标量值将会重复index的长度。
pd.Series(5,index=list('ABCDE'))
Series与adarray的相似性
Series的操作跟ndarray非常相似,可以调用numpy的大多数函数。
但是,切片这样的操作,同时也会对索引起作用。
s[0] s[:3] s[s>s.median()] s[[4,3,1]] np.exp(s)
注意:
我们会在索引和选择数据部分介绍数组类型的索引选择。
Series 和numpy的数组一样,可以通过dtype获取数据类型
s.dtype
如果你想把series转换成数组,可以使用series.array
s.array
尽管series与numpy的ndarray很像,但如果你想要得到真正的ndarray,可以使用series.to_numpy()
s.to_numpy()
Series 与字典的相似性
Series类似于固定大小的字典,可以通过索引标签来获取值
s['a'] s['e'] s 'e' in s 'f' in s
如果调用的标签值不存在,那么就会抛出异常
s['f']
使用get()方法,不存在的标签值调用时会返回None或者被指定的特定值
s.get('f') s.get('f',np.nan)
Series的向量化操作与标签对齐
当我们处理原生numpy数组时,我们不需要循环遍历每一个值。在pandas中处理series时也同样如此。series可以继承numpy的大多数方法用以处理类似ndarray的数据。
s + s # 可以直接进行加法运算 s * 2 # 可以进行乘法运算 s * s # 可以自我相乘 np.exp(s) # 使用numpy的方法
series和ndarray的一个关键不同之处在于,series处理数据时会自动根据索引标签进行对齐。因此,在你进行series计算时你可以忽略series是否具有相同的标签。
s[1:] + s[:-1] # 这俩series会自动根据彼此的索引值进行对齐计算。s[-1]是获取的倒数第2个值。这个具体在索引和选择数据篇章介绍。
两个索引标签没有对齐的series的计算结果会涉及到索引的并集运算。如果一个标签值在另外一个series中找不到,那么它对应的值会被标记为NaN(看上面例子中a和e的结果值)。
这种不需要明确的数据对齐的操作可以让我们在交互式数据分析和探索时能够非常自由和灵活的书写代码。这种特性也让pandas能够区别于市面上大多数的其他数据处理工具。
注意:
一般来说, 在处理索引标签不对齐的series的运算时,为了不丢失信息,我们会获取索引并集计算的默认结果。尽管数据被被标记为NaN,但是保留标签在运算时是非常重要的。当然,你也可以选择使用dropna删除包含NaN的索引数据。
Name方法
series有个name()方法可以为series命名
s = pd.Series(np.random.randn(5),name='随意') s s.name
Series的名字在大多数情况下会被默认分配一个,特别是在获取DataFrame的一维切片时(这部分你将在下面的内容中看到)。
可以通过Series.rename()方法来为Series重命名。
s.rename('与众不同')
(本文转自简道云用户:龙小马)
编辑于 2021-9-16 12:35
|