pandas中loc和iloc用法

这篇博客介绍了pandas中loc和iloc的区别。loc通过行索引或列名选取数据,iloc则依据行号和列号。在创建DataFrame后,文章详细展示了如何取行和列,以及在取多行时遇到的问题。loc可用于根据特定条件提取行,而iloc精确到行列位置。此外,文章还探讨了等值筛选和非等值筛选的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

loc函数:通过行索引 “Index” 或者"columns"中的具体值来取行、列数据
iloc函数:通过行号或者列号来取行、列数据(如取第二行的数据、取第0列的数据)
首先我们创建一个Data Frame

import numpy as np
import pandas as pd
#创建一个Dataframe
data=pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))
data
out:
	A	B	C	D
a	0	1	2	3
b	4	5	6	7
c	8	9	10	11
d	12	13	14	15

1.取行
方法一

#用loc
data.loc['a'] #取行index为‘a’的数据
#用iloc
data.iloc[0]#取第0行数据
#out:
A    0
B    1
C    2
D    3
Name: a, dtype: int64

想得到的结果为DataFrame格式?
方法二

data.loc[['a']] 
data.iloc[[0]]
#out:
	A	B	C	D
a	0	1	2	3

想取好几行?

data.loc[['a','d']] #取行index为‘a'和‘d'的数据
#out:
	A	B	C	D
a	0	1	2	3
d	12	13	14	15

data.iloc[[0,1]]	#取第0、1行的数据
#out:
	A	B	C	D
a	0	1	2	3
b	4	5	6	7

用方法一试试取好几行?

data.iloc[0,1]
#out:
1

怎么和想的中不一样?

data.loc['a','d']
#out:
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/Library/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py in _validate_key(self, key, axis)
   1789                 if not ax.contains(key):
-> 1790                     error()
   1791             except TypeError as e:

/Library/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py in error()
   1784                                .format(key=key,
-> 1785                                        axis=self.obj._get_axis_name(axis)))
   1786 

KeyError: 'the label [d] is not in the [index]'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-41-a9c720cf0498> in <module>()
----> 1 data.loc['a','d']

呀!怎么报错了?提示说index里没有标签d,咋回事,不急不急,我们先看列操作,这个问题稍后解决
2.取列

data.iloc[:,[0,3]] #取第0列和第三列
data.loc[:,['A','D']] #取A列和D列
#out:

	A	D
a	0	3
b	4	7
c	8	11
d	12	15

如果我们想取指定的行和列呢?
3.取指定的行、列

data.loc[['a','d'],['A','B']] #提取index为'a','d',列名为'A','B'中的数据
data.iloc[[0,3],[0,1]] #取第0行、3行,第0列、1列的数据
#out:
	A	B
a	0	1
d	12	13

现在我们回过头看1中遇到的问题:
data.iloc[0,1]表示的是取第0行第1列的数据,所以取出来的值只有1个
data.loc[‘a’,‘d’]表示的是取行index为‘a’,列名为‘d’的数据,并不是取行index为‘a’、‘d’的数据,所以报错来
4.利用loc函数,根据某个数据来提取数据所在的行

data.loc[data['B']==13] #取‘B’列值为13所在的行
#out:
	A	B	C	D
d	12	13	14	15
data.loc[(data['A']==12)&(data['B']==13)] #同时满足“A”列的值为12,“B”列的值为13
#out:
	A	B	C	D
d	12	13	14	15
data.loc[(data['A']==0)|(data['B']==13)]#同时满足“A”列的值为0或者“B”列的值为13
#out:
	A	B	C	D
a	0	1	2	3
d	12	13	14	15

同时,以下几种写法也可提取数据所在的行

data[data['B']==13]#dataframe用法
data[data['B'].isin([13])]#isin函数
data[(data['A']==12)&(data['B']==13)] #dataframe用法
data[(data['A'].isin([12]))&(data['B'].isin([13]))] #isin函数
#out:
	A	B	C	D
d	12	13	14	15
  1. 选取不等于某些值的行记录
data.loc[data['B']!=13]
data.loc[~data['B'].isin([13])]
#out:
	A	B	C	D
a	0	1	2	3
b	4	5	6	7
c	8	9	10	11

== 和!= 、 isin 和 ~ isin两组的区别在于第一组筛选的是等于或者不等于某个值的行,第二组筛选的是等于或者不等于某些值的行

data.loc[data['B'].isin([1,5])]
#out:
	A	B	C	D
a	0	1	2	3
b	4	5	6	7
data.loc[~data['B'].isin([1,5])]
#out:
	A	B	C	D
c	8	9	10	11
d	12	13	14	15
<think>嗯,用户想了解Pandaslociloc的区别使用场景。首先我得回忆一下这两个方法的区别。我记得loc是基于标签的索引,而iloc是基于整数位置的索引。过具体怎么区分呢?可能需要详细说明它们的用法,比如loc使用行或列的标签,而iloc使用位置索引,从0开始。 然后,用户可能需要例子来理解。比如,当用loc选择某一行时,需要传入行标签,而iloc则需要传入行号。比如df.loc["Adam"]df.iloc[0]这样的例子。但要注意,如果索引是默认的整数,而是自定义的标签,这时候iloc还是按照位置来选,管索引标签是什么。 接下来,切片的同。loc的切片是包含结束标签的,而iloc的切片包含结束位置,这Python的列表切片一样。比如df.loc['A':'C']会选A到C的行,而df.iloc[0:2]选的是01行。这个容易搞错,需要强调。 布尔索引方面,两者都可以用,但loc可能更直观,因为可以直接用条件表达式。比如df.loc[df['age'] > 30]。iloc的话可能需要结合其他方法,比如先得到布尔数组,再用位置索引,过这种情况可能太常见。 组合行列选择的时候,lociloc都可以接受两个参数,先行后列。比如df.loc[:, 'name':'age']选择所有行,列从name到age。而iloc则是用列的位置,比如df.iloc[:, 0:2]选择前两列。 使用场景的话,loc适合已知标签的情况,比如处理有时间戳索引的数据,或者有明确标识的行列。iloc适合按位置处理,尤其是当索引没有特定意义或者需要按顺序访问时。比如处理没有明确标签的数据集,或者需要循环遍历的时候。 可能还需要提到性能方面,虽然大多数情况下差异大,但iloc可能稍微快一点,因为基于位置的操作更直接。过这个可能是主要考虑因素,除非处理非常大的数据。 用户提供的引用资料里提到lociloc的说明,比如引用[2]中的.loc[]基于标签,.iloc[]基于整数索引。还有引用[3]中的例子,df.loc["Adam"]返回对应行的数据。这些可以作为参考,整合到回答中。 最后,生成相关问题的时候,要考虑用户可能进一步的问题,比如如何组合使用、如何处理错误、性能比较,以及实际应用的例子等。这样可以帮助用户更全面地理解这两个方法的应用。</think>### Pandaslociloc的区别及使用场景详解 在Pandas中,`loc``iloc`是两种核心的索引方法,但它们的行为适用场景有显著差异。以下从**语法规则**、**索引类型**、**切片行为**等角度详细对比: --- #### 一、核心区别 1. **索引类型** - `loc`:基于**标签(Label)**的索引,需传入行/列的**名称**(如字符串或时间戳)。 *示例*:`df.loc["Adam", "Age"]` 表示选择行标签为`Adam`、列标签为`Age`的值[^3]。 - `iloc`:基于**整数位置(Integer Position)**的索引,需传入行/列的**序号**(从0开始)。 *示例*:`df.iloc[0, 1]` 表示选择第1行、第2列的值[^2]。 2. **切片行为** - `loc`:切片**包含结束标签**。例如`df.loc["A":"C"]`会选取标签为`A`、`B`、`C`的所有行。 - `iloc`:切片**包含结束位置**,遵循Python列表的规则。例如`df.iloc[0:2]`仅选取第0行第1行[^1]。 3. **布尔索引支持** - 两者均可通过布尔数组筛选数据,但`loc`更直观: ```python # 使用loc筛选年龄大于30的行 df.loc[df["Age"] > 30] ``` --- #### 二、使用场景对比 | **场景** | **推荐方法** | **示例** | |-----------------------|--------------|-----------------------------------| | 按明确标签筛选数据 | `loc` | `df.loc[:, "Name":"Age"]` | | 按位置顺序访问数据 | `iloc` | `df.iloc[0:5, :]` | | 混合标签位置索引 | 结合使用 | `df.loc[df.index[0:3], "Score"]` | | 动态生成索引条件 | `iloc` | `df.iloc[np.where(scores > 90)]` | --- #### 三、代码示例 ```python import pandas as pd data = { "Name": ["Alice", "Bob", "Charlie"], "Age": [25, 30, 35], "Score": [85, 90, 95] } df = pd.DataFrame(data, index=["A", "B", "C"]) # 使用loc选择行标签为"A"的行列标签为"Name"到"Age"的列 print(df.loc["A", "Name":"Age"]) # 输出:Name: Alice, Age: 25 # 使用iloc选择第0行第1列 print(df.iloc[0, 1]) # 输出:25 # 混合使用:通过iloc获取位置索引,再用loc筛选 subset = df.iloc[0:2] print(subset.loc[:, "Score"]) # 输出:A:85, B:90 ``` --- #### 四、注意事项 1. **索引越界问题**:`iloc`对超出数据范围的位置会直接报错,而`loc`会返回空值。 2. **性能差异**:`iloc`通常略快于`loc`,因无需解析标签,但差异在小型数据中可忽略。 3. **避免链式赋值**:如`df.loc[...][...] = value`可能导致未预期的行为,推荐使用单次赋值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值