pandas 切片,iloc,loc,ix

本文介绍了如何使用Pandas库中的DataFrame进行数据操作,包括选择单列或多列、按行索引选择数据、条件过滤等常见操作,并展示了loc、iloc及ix的不同用法。
import pandas as pd

##create a raw data

raw_data = {
    'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks', 'Dragoons',
    'Dragoons', 'Dragoons', 'Dragoons', 'Scouts', 'Scouts', 'Scouts', 'Scouts'],
    'company': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'],
    'deaths': [523, 52, 25, 616, 43, 234, 523, 62, 62, 73, 37, 35],
    'battles': [5, 42, 2, 2, 4, 7, 8, 3, 4, 7, 8, 9],
    'size': [1045, 957, 1099, 1400, 1592, 1006, 987, 849, 973, 1005, 1099, 1523],
    'veterans': [1, 5, 62, 26, 73, 37, 949, 48, 48, 435, 63, 345],
    'readiness': [1, 2, 3, 3, 2, 1, 2, 3, 2, 1, 2, 3],
    'armored': [1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1],
    'deserters': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3],
    'origin': ['Arizona', 'California', 'Texas', 'Florida', 'Maine', 'Iowa', 'Alaska', 'Washington', 'Oregon', 'Wyoming', 'Louisana', 'Georgia']
}

df =pd.DataFrame(raw_data,columns = ['regiment', 'company', 'deaths', 'battles', 'size', 'veterans', 'readiness', 'armored', 'deserters', 'origin'])

df = df.set_index('origin')

df.head()

##1、选择一列,生成一个series
df['size']

##2、选择一列,生成一个dataframe
df[['size']]

##3、选择多列
df[['company','deaths']]

##4、根据行索引选择一行,生成一个series
df.loc['California']
##用iloc会出错,iloc接受int

##5、根据行索引选择一行,生成一个一行的df
df.loc[['California']]

##6、根据行索引选择多行,生成一个df
df.loc[['Arizona', 'California']]

##以上得知,pandas df的行和列是没有区别的,选择列索引,直接df[],选择行索引df.loc[]


##iloc
# 选择第二行,生成Series
df.iloc[1]
##选择第二行,生成df
df.iloc[[1]]

##选择前两行,左才右开
df.iloc[:2]

##选择第二到最后一行
df.iloc[1:]

##选择第二到第五行
df.iloc[1:5]



### 行列选择,使用loc行列索引进行行列选择
df.loc[['Texas','California'],['size','armored']]


##行列选择,使用iloc位置进行行列选择 0:5行,1,6,7列
df.iloc[0:5,[1,6,7]]


##选择前五列
df.iloc[:,:5]
# 用loc会出错


##条件过滤
df[(df['battles']>2) & (df['battles']<5)]


##行列同时选择
df.loc[(df['battles']>2) & (df['battles']<5),['size','battles']]


##loc根据索引,iloc根据位置,行列同时选择用loc


##根据索引和位置混合选择ix
df.ix[:3,['size','battles']]
df.ix[['California','Texas'],:5]

##条件和列索引
df.ix[(df['battles']>2) & (df['battles']<5),['size','battles']]


# 1. df[]直接索引
# 直接索引索引的是列,方口号里面的内容一般是列索引名。也可以接受一个列名组成的list来接受多个列名。
df['size']
df[['size','battles']]
# 如果要交换两列,直接用这样的方法是不对的:

df.loc[:,['size','battles']] = df[['battles', 'size']]

# 这是因为pandas默认在赋值的时候回匹配列名,这里面的AB和BA实际上没有区别。如果想要交换两列的话,应该使用AB两列的值作为右值,这样就不带列索引名了。
df.loc[:,['size','battles']] = df[['battles', 'size']].values


raw_data_1={'a':[1,2,3],1:[4,5,6],'c':[10,9,8]}

df_1=pd.DataFrame(raw_data_1)

# 选择列,不会取1
df_1[1]

##选择行
df_1[0:2]

# 1).loc,.iloc,.ix,只加第一个参数如.loc([1,2]),.iloc([2:3]),.ix[2]…则进行的是行选择
# 4)df[]只能进行行选择,或列选择,不能同时进行列选择,列选择只能是列名。
<think> 我们被要求回答关于pandaslociloc的使用方法、区别及应用场景。根据提供的引用,我们可以总结如下: 1. **loc**:基于标签的索引,即通过行和的标签名来选取数据。 2. **iloc**:基于整数位置的索引,即通过行和的位置(从0开始的整数)来选取数据。 引用[1]明确指出:loc是指location的意思,iloc中的i是指integer。引用[4]也提到,官方已经弃用ix,建议使用loc(基于标签)和iloc(基于位置)。 下面我们将详细说明使用方法、区别及典型应用场景。 ### 1. 使用方法 #### loc - 语法:`df.loc[行标签选择, 标签选择]` - 选择行时,可以使用单个标签、标签表、标签切片(包含两端)或布尔数组。 - 选择时,同样可以使用单个标签、标签表、标签切片(包含两端)或布尔数组。 - 示例(引用[3]): ```python data.loc[:, :] # 选取所有行和所有 ``` 引用[2]中展示了使用`pd.IndexSlice`进行多级索引的例子: ```python df1.loc[idx['b','two'], :] # 选取行标签为('b','two')的行,所有 df1.loc[idx[['b','c'],'one'], 'col2'] # 选取行标签为('b','one')和('c','one'),标签为'col2' ``` #### iloc - 语法:`df.iloc[行位置选择, 位置选择]` - 选择行时,使用整数位置(从0开始)、整数表、整数位置切片(不包含结束位置,即左闭右开)或布尔数组。 - 选择时,同样使用整数位置、整数表、整数位置切片(不包含结束位置)或布尔数组。 - 示例(引用[3]): ```python data.iloc[:, :] # 选取所有行和所有,按位置 ``` ### 2. 主要区别 | 特性 | loc | iloc | |--------------|-------------------------------------------|--------------------------------------------| | 索引类型 | 标签(label-based) | 整数位置(integer position-based) | | 切片行为 | 包含结束位置(如`'a':'c'`包含a和c) | 不包含结束位置(如`0:2`选择0和1) | | 传递表 | 标签表 | 整数位置表 | | 布尔索引 | 支持 | 支持 | | 多级索引 | 支持(如引用[2]示例) | 支持(但只能使用整数位置) | 引用[5]提供了一个DataFrame示例: ```python import pandas as pd data = pd.DataFrame({'a':[0,10,20,30,40], 'b':[1,11,21,31,41], 'c':[2,12,22,32,42]}) ``` 假设索引为默认整数索引(0,1,2,3,4): - `data.loc[0:2, 'a':'b']`:选择行标签0至2(包含2),标签'a'至'b'(包含'b'),即3行2。 - `data.iloc[0:2, 0:2]`:选择行位置0至2(不包含2,即0和1),位置0至2(不包含2,即0和1),即22。 ### 3. 应用场景 - **loc**:当你知道行或的标签时使用。例如,按姓名选取行,按名选取。尤其在使用自定义索引(非整数索引)时,loc非常方便。 - **iloc**:当你知道行或的具体位置(即第几行第几)时使用。例如,选取第0行、第2行和第4行,以及第1和第3。在需要按位置抽取数据(如前100个样本)时常用。 ### 总结 - 使用`loc`时,索引器是标签,切片包含两端。 - 使用`iloc`时,索引器是整数位置,切片不包含结束位置(与Python切片一致)。 - 由于`ix`已被弃用,应避免使用,转而使用`loc`和`iloc`[^4]。 通过正确使用这两种索引方法,可以高效地操作DataFrame中的数据。 §§相关问题§§ 1. 在多层索引(MultiIndex)的DataFrame中,lociloc的用法有什么不同? 2. 使用lociloc时如何处理布尔索引? 3. 为什么在pandas中要区分lociloc两种索引方式? 4. 如何避免在使用lociloc时出现`SettingWithCopyWarning`警告? </think> ### Pandaslociloc详解 #### 一、核心区别 1. **索引基础**: - `loc`:基于**标签(label)** 的索引(行名/名) - `iloc`:基于**整数位置(integer position)** 的索引(行号/号)[^1][^4] 2. **切片行为**: ```python # loc包含切片终点(闭区间) df.loc["a":"c"] # 包含a,b,c行 # iloc不包含切片终点(左闭右开) df.iloc[0:2] # 仅0,1行(不含第2行) ``` #### 二、使用方法 1. **loc操作**: ```python # 选择单行 df.loc["row_name"] # 选择行组合 df.loc["row1":"row3", "colA":"colC"] # 标签切片 # 布尔索引 df.loc[df["age"] > 30, ["name", "city"]] # 多级索引(示例引用[2]) idx = pd.IndexSlice df.loc[idx["b":"c", "one"], "col2"] ``` 2. **iloc操作**: ```python # 选择前3行 df.iloc[0:3] # 选择特定行位置 df.iloc[[0,2,4], [1,3]] # 第0,2,4行 & 第1,3 # 全表选择(引用[3]) df.iloc[:, :] # 所有行和 ``` #### 三、典型应用场景 1. **loc适用场景**: - 按业务ID选取数据(如`df.loc["C001"]`) - 基于名筛选字段(如`df.loc[:, ["price","quantity"]]`) - 使用条件过滤(如`df.loc[df.sales>1000]`) 2. **iloc适用场景**: - 处理无标签数据集(如csv读取时无名) - 按固定位置采样(如`df.iloc[::10]`每10行取1条) - 机器学习特征矩阵操作(如`X = df.iloc[:, :-1]`) #### 四、注意事项 1. 避免混用导致错误: ```python # 错误示例(整数索引 vs 字符串标签) df.loc[0:2] # 若索引是字符串,报KeyError df.iloc["a"] # 必定报错,iloc只接受整数 ``` 2. 官方已弃用`ix`方法,推荐使用`loc`/`iloc`替代[^4] #### 五、性能建议 - 大数据集优先用`iloc`(整数计算更快) - 多级索引推荐`loc`+`IndexSlice`[^2] - 修改数据时注意视图与副本问题: ```python df.loc["row1"] = 10 # 直接修改原数据 ``` > 关键总结:**标签选loc,位置选iloc**。当索引为整数时,优先确认是否需要标签语义(如时间序序号)再选择方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值