索引器包括loc和iloc两种(索引器参数必须是2个和两个以上)
python中iloc 和loc ix的区别
loc 在index的标签上进行索引,范围包括start和end。
iloc 在index的位置上进行索引,不包括end.。
ix 是 iloc 和 loc的合体。
Python(英语发音:/?pa?θ?n/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。
Pandas介绍
首先,需要先安装numpy和pandas环境,参考:
。以下语句检查并确认安装成功。
Pandas 有三种基本数据结构:Series、DataFrame 和 Index。
Pandas 的 Series 对象是一个带索引数据构成的一维数组。Series 对象将一组数据和一组索引绑定在一起,我们可以通过 values 属性和 index 属性获取数据。values 属性返回的结果与 NumPy 数组类似;index 属性返回的结果是一个类型为 pd.Index 的类数组对象。
可以像访问Numpy那样来访问Series(序号也是从0开始计数的)。
Pandas 的 Series 对象比Numpy更加灵活、通用。
两者的主要区别是:NumPy 数组通过 隐式定义 的整数索引获取数值,而 Pandas 的 Series 对象用一种 显式定义 的索引与数值关联。也就是说,Numpy的索引是系统自分配的无法更改,但是Series对象是可以手工指定的。
Series是 特殊的字典 ,Series 对象其实是一种将类型键映射到一组类型值的数据结构,Pandas Series 的类型信息使得它在某些操作上比 Python 的字典更高效。用字典创建 Series 对象时,其索引默认 按照顺序排列 。
DataFrame类似于RDBMS中的Table。DataFrame就可以看作是一种既有灵活的行索引,又有灵活列名的二维数组。
DataFrame有2个常用属性,分别是 index 属性 和 columns 属性 。前者可以获取索引标签(行标签);后者是是存放列标签的Index 对象。DataFrame 是特殊的字典,一列映射一个Series 的数据。
DataFrame可以通过以下几种方式来创建:(1)通过单个 Series 对象创建。(2)通过字典列表创建。(3)通过 Series 对象字典创建。(4)通过NumPy 二维数组创建。(5)通过 NumPy 结构化数组创建。
可以将Index视为一个不可变数组或有序集合。当作为不可变数组时,一般数组的访问方式(例如切片等)对Index适用,与数组的最大区别是 Index对象不可更改 。当作为集合时,Index也可以做交集、并集等常规操作。
Series的访问既可以作为字典,也可以作为一维数组。数据访问的方法,可以参考Numpy的访问方式,这里不赘述。
如果Series的显式索引是整数,那么在访问时,很容易混淆。例如下边的例子:
从上边的例子总结得出,python的默认规则是:在单个访问时,使用的显式索引,而在切片时,使用的是隐式索引,很容易混淆!python提供了loc、iloc和ix三种索引器。
loc表示:表示取值和切片都是显式的。iloc 属性,表示取值和切片都是隐式索引。ix是loc和iloc的混合形式,应用于dataFrame(使用例子在3.3节)。
dataframe可以通过对列名进行字典形式(dictionary-style)的取值获取数据。可以把 DataFrame 看成是一个增强版的二维数组,用 values 属性按行查看数组数据。ix 索引器对于整数索引的处理和之前在 Series 对象中介绍的一样,都容易让人混淆。
对于一元运算(像函数与三角函数),这些通用函数将在输出结果中保留索引和列标签(很简单,所有元素做相应运算并返回);而对于二元运算(如加法和乘法),Pandas 在传递通用函数时会自动 对齐索引 进行计算。
当在两个 Series 或 DataFrame 对象上进行二元计算时,Pandas 会在计算过程中对齐两个对象的索引。如果想给缺失数值指定一个默认值,需要使用add来替代+,并指定fill_value:
两个对象的行列索引可以是不同顺序的,结果的索引会自动按顺序排列。
DataFrame 和 Series 的运算规则,与NumPy 中二维数组与一维数组的运算规则是一样的。需要使用广播原则,那么默认地,会按行计算。如果想要按列运算,需要使用参数axis = 0 。
注意:DataFrame访问行可以使用loc,但是访问列,只能是df['col']这种形式了。
缺失值有三种形式:null、NaN 或 NA。
处理缺失值,一般有两种方法:一种方法是通过一个覆盖全局的掩码表示缺失值,另一种方法是用一个标签值(sentinel value)表示缺失值。
掩码是利用一个跟原来一样大小的矩阵,用0或者1表示某个元素缺失。标签值是利用一个特殊字符例如NaN表示缺失。
Pandas 选择用标签方法表示缺失值,包括两种 Python 原有的缺失值: 浮点数据类型(包括整型) 的 NaN 值,以及 Python的 None 对象 。
使用None时,表示一个空的python对象,所以numpy的dtype=object,因为是对象所以在进行大批量计算时,效率会比标量低。使用np.nan时表示标量,效率会高很多。
对于缺失值,pandas提供了几个有用的API方法,分别是:isnull(),notnull(),dropna(),fillna()。其中,对于dataframe,dropna()方法默认会将包含NaN的整行都drop掉,如果想按照整列drop,增加axis=1参数。
pandas的MultiIndex提供了多级索引的功能,用元组表示是多级索引的基础。
下面例子,使用元组索引生成Series。筛选2019的索引,非常繁琐。
Pandas 的 MultiIndex 类型提供多种实现方法,下边例子使用元组表示实现。
unstack() 方法可以快速将一个多级索引的 Series 转化为普通索引的DataFrame。stack() 方法实现相反的效果。
总结一下,创建多级索引的方法包括:
(1)通过一个有不同等级的若干简单数组组成的列表来构建 MultiIndex:pd.MultiIndex.from_arrays。
(2) 多个索引值的元组构成的列表创建 MultiIndex:pd.MultiIndex.from_tuples。
(3)用两个索引的笛卡尔积创建MultiIndex:pd.MultiIndex.from_product。
(4)直接提供 levels和labels创建 MultiIndex(lablels是指每个级别的整数指定每个位置):
上边的例子中,不管是Series还是DataFrame都是按照行来进行多级索引,其实,也可以按列索引,而且非常简单,下边是一个例子(几个学生在2018和2019两次考试的不同科目成绩):
需要对多级索引做显示切片操作时,可以使用pd.IndexSlice对象来切,不同级别的维度,拿逗号分割,例如下边例子中的df_sd_003.loc[idx_sd[2018,:],idx_sd['Alice',:]]。其他切片和取值操作与Numpy很类似。
如果 MultiIndex 不是有序的索引,那么大多数切片操作都会失败。
如果Series或者DataFrame的索引是未排序的,可以简单地通过sort_index方法来快速排序。
层级数据维度转换的另一种方法是行列标签转换,可以通过reset_index 方法实现
通过pd.concat()实现pandas对象合并,pd.cancat的所有参数(下面列举的是这些参数的默认值):
pd.concat() 可以简单地合并一维的 Series 或 DataFrame 对象,与
np.concatenate() 合并数组一样。
DataFrame 的合并默认都是逐行进行的(axis=0);pd.concat在合并时会保留索引,即使索引是重复的!如果设置 verify_integrity=True,那么生成重复索引时,会触发异常!有时索引无关紧要,那么合并时就可以忽略它们,可以通过设置 ignore_index 参数来实现。默认的合并方式是对所有输入列进行并集合并(join='outer'),当然也可以用 join='inner' 实现对输入列的交集合并。下面是一个实现合并的例子:
Pandas 的基本特性之一就是高性能的内存式数据连接(join)与合并(merge)操作。
pd.merge() 实现的功能基于关系代数(relational algebra)的一部分。 pd.merge() 函数实现了三种数据连接的类型:一对一、多对一和多对多。pd.merge()会自动识别2个dataframe共有的列,并以这个列进行关联。
上边的例子中,关联的两个dataframe具有相同名称的列,pandas会直接按同名列合并,由于两个输入要合并的列通常都不是同名的,因此 pd.merge() 提供了一些参数处理这个问题。
1.最简单的方法就是直接将参数 on 设置为一个列名字符串或者一个包含多列名称的列表,这个参数只能在两个 DataFrame 有共同列名的时候才可以使用。
Python 基本操作- 数据选取loc、iloc、ix函数
loc中的数据是列名,是字符串,所以前后都要取;iloc中数据是int整型,所以是Python默认的前闭后开
构建数据集df
loc函数主要通过行标签索引行数据 ,划重点, 标签!标签!标签!
loc[1] 选择行标签是1的(从0、1、2、3这几个行标签中)
loc[0:1] 和 loc[0,1]的区别,其实最重要的是loc[0:1]和iloc[0:1]
索引某一列数据,loc[:,0:1],还是标签,注意,如果列标签是个字符,比如'a',loc['a']是不行的,必须为loc[:,'a']。
但如果行标签是'a',选取这一行,用loc['a']是可以的。
iloc 主要是通过行号获取行数据,划重点,序号!序号!序号!
iloc[0:1],由于Python默认是前闭后开,所以,这个选择的只有第一行!
如果想用标签索引,如iloc['a'],就会报错,它只支持int型。
ix——结合前两种的混合索引,即可以是行序号,也可以是行标签。
如选择prize10(prize为一个标签)的,即 df.loc[df.prize10]
还有并或等操作
python选取特定列——pandas的iloc和loc以及icol使用
pandas入门——loc与iloc函数
pandas中loc、iloc、ix的区别
pandas基础之按行取数(DataFrame)
5.层次化索引
到目前为止我们关注的是保存在Pandas Series和DataFrame中的一维和二维数据。
通常超越二维的数据,即用两个以上键值索引的数据也是很有用的。
尽管Pandas提供了“Panel”和“Panel4D”对象来本地处理3维和4维数据,实践中更常用的方式是在单个索引中使用层次化索引(也叫多级索引)来包含多个索引。
以这种方式,高维数据可以被紧凑的表示在我们熟悉的一维Series和二维DataFrame对象中。
在这部分,我们将探索直接创建多级索引对象,仔细考虑对多级索引数据的索引,切片和计算统计,还会介绍对数据进行简单和层次化索引转换有用的函数。
我们以标准的导入开始:
让我们由考虑如果使用一维Series表达二维数据开始。具体讲,我们考虑那种带有字母和数字键值数据的Series。
假设你想要追踪两个不同年份的州数据。使用我们已经讲过的Pandas工具,你可能首先想到的是简单的使用Python元组作为键值:
使用这种索引方案,你可以直接基于多索引进行Series的索引和切片操作:
但是便利也就到此为止了。例如,如果你需要选取所有2010年的值,你需要使用混乱(有可能缓慢的)方法才能实现:
这种方法得到了期待的结果,但它并不像我们喜爱的Pandas切片操作那样简洁(在数据很大时,效率也不高)。
幸运的是,Pandas提供了一种更好的方法。我们基于元组的索引本质上来说是初级的多索引,Pandas的多级索引类型带来我们所希望的操作类型。我们可以像下面这样通过元组创建多索引:
注意MultiIndex包含多个索引级别,在这个例子中,有州名称和年份,以及多个为每个数据点都记录层级的标签。
这里Series结果的头两列显示的是多索引值,第三行显示的是数据。注意第一列里面一些条目是空的:在多索引表达是,空位表示那里面的值与上一行的值一样。
现在访问第二个索引是2010的所有数据,我们就可以简单的使用Pandas切片记号:
结果是带有我们想要键值的单索引数组。跟我们开始时自制的基于元组的解决方法相比,现在的语法更简洁(执行效率也更高)。我们将会更深入的讨论这类在层级索引数据上面索引操作。
这里你也许会注意到一点别的东西:我们可以很容易的使用带有索引和列标签的DataFrame来存储同样的数据。实际上,Pandas在设计时也想到了这种对等性。unstack()方法会快速的将多层索引Series转换成常用的DataFrame:
自然而然,stack()方法提供了相反的操作:
看到这,您可能奇怪为什么我们还要麻烦的使用层级索引。原因很简单:就如我们可以用一维Series的多层级索引来表示二维数据一样,我们也能使用Series或DataFrame来表示三维或多维数据。多级索引中每个额外的层级代表数据的一个维度;这个属性为我们可以表示的数据类型带来许多灵活性。具体来讲,我们想要添加一列来表示每年的人口统计数据(比如,小于18岁的人口数);使用多级索引,就是简单的在DataFrame中添加一列:
另外,所有ufuncs和其他在Operating on Data in Pandas 讨论的功能都能在层次化索引上工作的很好。我们用上面的数据,来计算每年低于18岁的人口比例:
这使我们可以方便和快捷操纵高维数据。
为Series和DataFrame创建多级索引最直接的方法就是传递两个或多个索引数组给构造器。例如:
创建索引的工作由后台去做。
类似的,如果你传递一个带有适当元组作为键值的字典的话,Pandas将会自动识别并且使用多级索引:
然而,有时候明确的创建多级索引也是很有用的;我们来看几个用法。
如何构造索引有更多的灵活性,你可以使用类构造方法pd.MultiIndex。例如,如我们之前做的,可以通过给出了各级索引值的数组列表来构建多级索引:
也可以通过已经给出每个点多级索引值的元组列表来构建:
甚至可通过单索引的笛卡尔积来创建:
同样的,可以直接通过传递内部编码levels(包含每级可用索引值的列表)和lables(指代这些标签的列表)来构造多级索引:
所有这些对象,在创建Series或DataFrame时,都可用作为index参数传进去,或者传递给已经存在了的Series或DataFrame对象的reindex方法。
有时,给多级索引的层级命名时很有用的。命名可以通过names参数给MultiIndex构造器来实现,或者设置已有索引的names属性:
随着参与的数据集变多,给索引命名来记录不同索引的意义是非常有用的。
在DataFrame中,行和列是完全对称的,正如行有多级索引,列也可以有多级索引。考虑如下模拟的医疗数据:
我们很容易的得到了行和列的多级索引。这基本上是四维数据,访问对象,检查类型,年份和访问次数。有了这个,我们可以通过最上层人的名称来检索,并且能够得到只包含那个人信息的完整DataFrame:
对于包含多个标签涵盖多次,多个主题(人口,国家,城市等)的复杂数据记录,使用层级化的行和列索引将会极其方便!
多索引上面的检索和切片被设计的很直观,把索引当作是增加的维度将会很有帮助。
我们首先来看Series上的多索引检索,然后再看DataFrame上的。
考虑我们之前看到的州人口的多索引Series:
借助于多条目索引,我们可以访问单个数据元素:
MultiIndex也支持部分索引,或者只是检索索引层级中的一个。结果是另一个Series,保留着较低层的索引。
部分切片也是可用的,只要多级索引是排过序的(参见 Sorted and Unsorted Indices ):
对于排过序的索引,将前级索引置为空,基于低层级索引的检索操作也可以执行:
其他类型的检索和筛选操作(见 Data Indexing and Selection ) 工作的也很好;例如,基于布尔过滤筛选:
基于花式索引的筛选也可以工作:
DataFrame的多层索引的行为与Series类似。考虑前面用到的医疗数据DataFrame:
要记住列在DataFrame中是主要元素,用于Series的多级索引语法也适用于列。例如我们可以使用简单的方式获得Guido的心率:
同样,与单一索引情况一样,我们可以使用loc,iloc和ix 见 Data Indexing and Selection 。例如:
这些检索器在二维数据上需要提供数组类似输入,但可以把多索引元组传递给loc和iloc。例如:
在索引元组中使用切片不是特别方便;尝试在元组中使用切片将会导致语法错误:
可以通过显示使用Python内置的slice()函数构建期望的切片来绕过上面的限制。但更好的办法是使用IndexSlice对象,它是Pandas专门用来处理这种情形的。例如:
有许多方法可以同多索引Series和DataFrame进行交互,如同本书中的许多工具一样,最好的熟悉方法是多尝试!
使用多索引数据的一个关键是知道如何有效的转换数据。有许多操作会保留数据集的所有信息,但为了不同的目的而对它进行重拍。我们看过简短的例子:stack()和unstack()方法;但是有更多方法可以精细的控制数据在层级索引和列直接进行转换,让我们来探索它们:
之前我们曾经有警告,但在这里应该强调一下.如果索引是未排序的话,许多多索引切片操作将会失败。
我们由创建一些简单的未排序多索引数据开始:
如果对这个索引进行部分切片的话,它将导致一个错误:
尽管错误信息不是特别清楚,原因是多级索引没有排序。因为各种原因,部分切片和其它类似操作要求多级索引的各个层级是排序了的。Pandas提供了几种方法的函数来执行这类排序;例如DataFrame的sort_index()和sortlevel()方法。这儿我们使用最简单的sort_index():
索引经过这样的排序,部分切片就会按期望的工作了:
我们前面简要的见过,可以将聚集的多索引转换未简单的二维表现,所使用的层级是可以选的:
unstack()的反向操作是stack(),它可以用来恢复原始的Series:
另一种重排层级化数据的方法是将索引标签变成列;这可以通过reset_index方法实现。在人口字典上调用这个方法会导致原来index里面的state和year信息变成DataFrame对应的列。为清晰起见,我们可以指定数据列显示的名称:
通常在现实世界中,原始的输入数据就是这个样子的。通过列名称来构建多索引非常有用。可以同DataFrame的set_index方法来实现,结果返回的就是多级索引DataFrame:
在实践中,我发现这类重置索引的方法是处理真实数据集最有用的模式之一。
我们之前看到过Pandas的内部数据聚合方法,例如mean(),sum()和max()。对于层级索引数据,可以传递一个level参数来控制对那个数据子集进行计算。例如,我们回到健康数据:
也许我们想平均一下每年两次来访的测量值。我们可以通过指定想要的索引层级名称来实现,本例使用的是year:
借助于使用关键字axis,我们也可以获取列中某层级的均值:
只用了两行,我们就能够发现访问对象的每年平均心率和体温测量值。这个语法实际是Groupby功能的快捷方法,见 Aggregation and Grouping
虽然这只是一个小例子,许多真实的数据集由相似的层级结构。
Pandas还有几种我们没有讲到的数据类型,即pd.Panel和pd.Panel4D对象。它们分别可以被看做是泛化的3维和4维结构,就像Serie是一维,DataFrame是二维一样。一旦熟悉了Series和DataFrame的索引和数据操作,对Panel和Panel4D基本可以直接使用。特别是索引器ix,loc和iloc,它们完全适用于这些高维数据结构。
我们不会再覆盖这些面板结构,因为我发现在大多数情况下,多级索引是非常有用的,并且可以在概念上非常简洁的表示高维数据。另外面板数据是密数据表达,而多级索引基本上是稀数据表达。随着维度的增加,密表达方式对于真实数据集来说变得效率很低。但对于一些特殊的应用,这些结构也很有用。如果想要知道更多关于Panel和Panel4D结构,请看列在 Further Resources .中的参考文献。
【数据分析】:Pandas的函数与功能
【注意】:显示索引选择时,包括最后一个索引。隐式索引则不包括。
索引器包括:loc、iloc、ix
[Out]:
[Out]:
【技能提升】:ix 索引器,可以将显示索引和隐式索引混合使用。但是 ix不被新版本支持了,所以作为了解就好。
【】:
任何处于处理Numpy形式数据的方法 ,都可以用于这些索引器。比如:掩码、花式索引;
【】:任何一种取值方法,都可以用于调整数据。
【解释】:
[Out]:
【解释】:
【注释】:
Pandas 采用标签法来表示缺失值,有两种方式:
【注意】:
pandas 将None与NaN看成是可等价交换的,在适当的时候,会将两者进行替换,除此之外,Pandas 会将没有标签值的数据,自动转换成NaN。实例如下:
andas:对不同类型的缺失值的转换规则
【注意】:Pandas 中,字符串使用object类型存储。
关于 【thresh】:通过thresh 设置非缺失值的最小数量(thresh=n:表没有缺失值)
【方法优化】:
将Series | DataFrame 的index参数设置为至少二维的索引数组