① 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——结合前两种的混合索引,即可以是行序号,也可以是行标签。
如选择prize>10(prize为一个标签)的,即 df.loc[df.prize>10]
还有&并或等操作
python选取特定列——pandas的iloc和loc以及icol使用
pandas入门——loc与iloc函数
pandas中loc、iloc、ix的区别
pandas基础之按行取数(DataFrame)
② Python 数据处理(二十四)—— 索引和选择
如果你想获取 'A' 列的第 0 和第 2 个元素,你可以这样做:
这也可以用 .iloc 获取,通过使用位置索引来选择内容
可以使用 .get_indexer 获取多个索引:
警告 :
对于包含一个或多个缺失标签的列表,使用 .loc 或 [] 将不再重新索引,而是使用 .reindex
在以前的版本中,只要索引列表中存在至少一个有效标签,就可以使用 .loc[list-of-labels]
但是现在,只要索引列表中存在缺失的标签将引发 KeyError 。推荐的替代方法是使用 .reindex() 。
例如
索引列表的标签都存在
先前的版本
但是,现在
索引标签列表中包含不存在的标签,使用 reindex
另外,如果你只想选择有效的键,可以使用下面的方法,同时保留了数据的 dtype
对于 .reindex() ,如果有重复的索引将会引发异常
通常,您可以将所需的标签与当前轴做交集,然后重新索引
但是,如果你的索引结果包含重复标签,还是会引发异常
使用 sample() 方法可以从 Series 或 DataFrame 中随机选择行或列。
该方法默认会对行进行采样,并接受一个特定的行数、列数,或数据子集。
默认情况下, sample 每行最多返回一次,但也可以使用 replace 参数进行替换采样
默认情况下,每一行被选中的概率相等,但是如果你想让每一行有不同的概率,你可以为 sample 函数的 weights 参数设置抽样权值
这些权重可以是一个列表、一个 NumPy 数组或一个 Series ,但它们的长度必须与你要抽样的对象相同。
缺失的值将被视为权重为零,并且不允许使用 inf 值。如果权重之和不等于 1 ,则将所有权重除以权重之和,将其重新归一化。例如
当应用于 DataFrame 时,您可以通过简单地将列名作为字符串传递给 weights 作为采样权重(前提是您要采样的是行而不是列)。
sample 还允许用户使用 axis 参数对列进行抽样。
最后,我们还可以使用 random_state 参数为 sample 的随机数生成器设置一个种子,它将接受一个整数(作为种子)或一个 NumPy RandomState 对象
当为该轴设置一个不存在的键时, .loc/[] 操作可以执行放大
在 Series 的情况下,这实际上是一个追加操作
可以通过 .loc 在任一轴上放大 DataFrame
这就像 DataFrame 的 append 操作
由于用 [] 做索引必须处理很多情况(单标签访问、分片、布尔索引等),所以需要一些开销来搞清楚你的意图
如果你只想访问一个标量值,最快的方法是使用 at 和 iat 方法,这两个方法在所有的数据结构上都实现了
与 loc 类似, at 提供了基于标签的标量查找,而 iat 提供了基于整数的查找,与 iloc 类似
同时,你也可以根据这些索引进行设置值
如果索引标签不存在,会放大数据
另一种常见的操作是使用布尔向量来过滤数据。运算符包括:
|(or) 、 &(and) 、 ~ (not)
这些必须用括号来分组,因为默认情况下, Python 会将 df['A'] > 2 & df['B'] < 3 这样的表达式评估为 df['A'] > (2 & df['B']) < 3 ,而理想的执行顺序是 (df['A'] > 2) & (df['B'] < 3)
使用一个布尔向量来索引一个 Series ,其工作原理和 NumPy ndarray 一样。
您可以使用一个与 DataFrame 的索引长度相同的布尔向量从 DataFrame 中选择行
列表推导式和 Series 的 map 函数可用于产生更复杂的标准
我们可以使用布尔向量结合其他索引表达式,在多个轴上索引
iloc 支持两种布尔索引。如果索引器是一个布尔值 Series ,就会引发异常。
例如,在下面的例子中, df.iloc[s.values, 1] 是正确的。但是 df.iloc[s,1] 会引发 ValueError 。
③ Python数据分析笔记#8.2.2 索引上的合并
“目录”
数据规整:聚合、合并和重塑
Data Wrangling: Join, Combine, and Reshape
--------> 数据库风格的DataFrame合并
--------> 索引上的合并
上一篇笔记讲的是如何根据DataFrame的列名来链接两个DataFrame对象。
有时候我们要根据DataFrame中的index索引来合并数据。这种情况下,我们可以传入 left_index=True或right_index=True 或两个都传入来说明索引被用作链接键。
我们先创建两个DataFrame,指明根据第一个DataFrame的'key'列和第二个DataFrame的index索引来合并数据:
默认的merge方法是求取链接键的交集,通过传入how='outer'可以得到它们的并集:
层次化索引数据的合并
对于层次化索引的数据的合并,我们要以 列表的形式指明用作合并键的多个列 。
比如下面我们就指定根据第一个DataFrame的'key1'列和'key2'列以及第二个DataFrame的index索引来合并:
同时使用双方的索引来合并也没问题:
join方法
DataFrame还有便捷的实例方法join,它能更方便的实现按索引合并,但要求没有重叠的列。
我们还可以向join传入一组DataFrame,类似于concat函数,实现多个DataFrame的合并拼接:
-END-
④ pandas将某一行设置为列索引(python)
b[b.['state']=='ohio'].index
In [36]: list(df['state']).index('ohio')
Out[36]: 0
In [37]: list(df['state']).index('nevada')
Out[37]: 1
访问某一列可以通过b['state']和b.state这两种方法进行,但是输出的pandas里面的Series这种数据类型,因此b['state'].index()返回Index([0,1], dtype=object)。
因为数据分析知某个值并不是非常重要,所以没有直接输出索引值的函数,可以通过query()函数,b.query('state == "obio"'),输出含有ohio的行自然也就知道索引。
(4)python数据索引扩展阅读:
索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。
在数据库关系图中,可以在选定表的“索引/键”属性页中创建、编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。
在数据库系统中建立索引主要有以下作用:
(1)快速取数据;
(2)保证数据记录的唯一性;
(3)实现表与表之间的参照完整性;
(4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。
⑤ Python 数据处理(二十九)—— MultiIndex 高级索引操作
从语法上将 MultiIndex 与 .loc 集成在高级索引中是有些挑战性。通常, MultiIndex 的键采用元组的形式。例如
注意 : 虽然也可以使用 df.loc['bar', 'two'] ,但这种简写的符号通常会导致歧义
如果你还想用 .loc 索引某一列,你必须像这样使用一个元组
想要获取第一个级别的某一标签的所有元素,并不需要传递元组,例如
而不是使用 df.loc[('bar',),] (等价于 df.loc['bar',] )
当然,也可以进行切片
通过提供一个元组切片,选择范围内的值
传递一个标签或元组列表的工作原理类似于 reindex
需要注意的是,在 pandas 中,当涉及到索引时,元组和列表的处理方式并不相同。
元组被解释为一个多级键,而列表则用来指定多个键。或者换句话说,元组是横向的,列表是纵向的
您可以通过提供多个索引器来对 MultiIndex 进行切片
可以使用 slice(None) 选择该级别的所有内容,没有指定索引的级别默认为 slice(None)
通常,切片的两段都会包括在内,因为这是标签索引
在使用 .loc 的时候,最好同时指定索引(行)和标签(列),因为在某些情况下,传递的索引可能会被解析为两个轴而不是 MultiIndex
你应该使用
而不是
例如
使用切片,列表和标签的基本 MultiIndex 切片操作
你可以使用 pandas.IndexSlice 来让 : 语法显得更自然一些,而不是使用 slice(None)
可以使用这种方法在多个轴同时进行相当复杂的选择
您可以使用布尔索引器来进行与值相关的选择
您还可以为 .loc 指定 axis 参数,以在某一个轴上传递切片
此外,您可以使用以下方法设置这些值
也可以在等号右边使用可对齐对象
DataFrame 的 xs() 方法还接受一个 level 参数,以便更容易在 MultiIndex 的特定级别上选择数据
使用切片
您还可以为 xs 提供 axis 参数来选择列
使用切片
xs 还允许使用多个键进行选择
使用切片
您可以将 drop_level=False 传递给 xs ,以保留所选择的级别
使用 drop_level=True (默认值)与上面的结果比较
在 pandas 对象的 reindex() 和 align() 方法中使用 level 参数,可以在一个级别上广播值
swaplevel() 方法可以切换两个级别的顺序
reorder_levels() 方法是 swaplevel 方法的推广,允许你在一个步骤中排列分层索引级别
rename() 方法可用于重命名 MultiIndex 的标签,通常用于重命名 DataFrame 的列
rename 的 columns 参数允许指定需要重命名的列的字典
这个方法也可以用来重命名 DataFrame 主索引的特定标签
rename_axis() 方法用于重命名 Index 或 MultiIndex 的名称。
特别地,可以指定 MultiIndex 的级别名称,可以使用 reset_index() 将 MultiIndex 移动到列
注意 : DataFrame 的列是一个索引,因此使用 rename_axis 和 columns 参数可以改变该索引的名称
rename 和 rename_axis 都支持指定字典、 Series 或映射函数来将标签/名称映射到新值
当直接使用 Index 对象而不是通过 DataFrame 工作时,可以使用 Index.set_names() 来更改名称
您不能通过 level 设置 MultiIndex 的名称
使用 Index.set_names() 替代