科普:定位train.loc[ 行条件 , 列名 ],如:train.loc[train[‘target‘] < -30, ‘outliers‘] = 1
·
pandas 在二维表中location定位
一、train.loc[ 行筛选 , 列名 ]
1. 定位
train.loc[ 行条件 , 列名 ]
作用:精准定位 → 满足【行条件】的行 + 指定列
效果:只修改/选中这个“小矩形区域”
2. 最经典用法
train.loc[train['target'] < -30, 'outliers'] = 1
- 行:选出
target < -30的所有行 - 列:定位到
outliers列 - 动作:把这些位置的值改设为 1
3. 最简单例子
# 表格
# 姓名 年龄 城市
# 小明 20 北京
# 小红 25 上海
# 小刚 30 北京
# 定位:城市=北京 的行,年龄列
df.loc[df['城市'] == '北京', '年龄'] = 18
结果:
小明 18 北京
小红 25 上海
小刚 18 北京
二、 loc 实战练习
题目1:基础用法(条件筛选 + 赋值)
假设我们有一个学生成绩表 df:
| 姓名 | 语文 | 数学 | 总分 | 是否及格 |
|---|---|---|---|---|
| 小明 | 90 | 85 | 175 | |
| 小红 | 55 | 60 | 115 | |
| 小刚 | 40 | 50 | 90 | |
| 小丽 | 80 | 95 | 175 |
要求:用 loc 把「总分 < 120」的学生,标记为“不及格”(即把 是否及格 列设为 False),其他设为 True。
答案 & 解析
# 先默认全部及格
df['是否及格'] = True
# 把总分 < 120 的标记为不及格
df.loc[df['总分'] < 120, '是否及格'] = False
结果:
| 姓名 | 语文 | 数学 | 总分 | 是否及格 |
|---|---|---|---|---|
| 小明 | 90 | 85 | 175 | True |
| 小红 | 55 | 60 | 115 | False |
| 小刚 | 40 | 50 | 90 | False |
| 小丽 | 80 | 95 | 175 | True |
题目2:多条件筛选 + 多列赋值(竞赛高频)
还是上面的成绩表,要求:
- 找出「语文≥80 且 数学≥80」的学生
- 给这些学生的
总分加 10 分(加分项) - 同时给他们新增一列
优秀学生,设为True,其他为False
答案 & 解析
# 先初始化优秀学生列
df['优秀学生'] = False
# 多条件筛选 + 同时修改两列
cond = (df['语文'] >= 80) & (df['数学'] >= 80)
df.loc[cond, '总分'] += 10
df.loc[cond, '优秀学生'] = True
结果:
| 姓名 | 语文 | 数学 | 总分 | 是否及格 | 优秀学生 |
|---|---|---|---|---|---|
| 小明 | 90 | 85 | 185 | True | True |
| 小红 | 55 | 60 | 115 | False | False |
| 小刚 | 40 | 50 | 90 | False | False |
| 小丽 | 80 | 95 | 185 | True | True |
题目3:结合 isin() 筛选 + 多列赋值(进阶)
现在我们想处理特定学生的成绩:
要求:给姓名为「小明」和「小丽」的学生,语文、数学各加 5 分,同时把他们的 是否及格 强制设为 True。
答案 & 解析
# 筛选条件:姓名在列表中
cond = df['姓名'].isin(['小明', '小丽'])
# 同时修改多列
df.loc[cond, ['语文', '数学']] += 5
df.loc[cond, '是否及格'] = True
结果:
| 姓名 | 语文 | 数学 | 总分 | 是否及格 | 优秀学生 |
|---|---|---|---|---|---|
| 小明 | 95 | 90 | 185 | True | True |
| 小红 | 55 | 60 | 115 | False | False |
| 小刚 | 40 | 50 | 90 | False | False |
| 小丽 | 85 | 100 | 185 | True | True |
关键知识点:
loc的列名可以传列表,实现一次性修改多列。
三、二维表格(DataFrame)的 5 种定位方法
除上述定位方法外,还有其它方法,一并总结如下。
方法1:loc —— 按【标签/条件】定位(最常用)
df.loc[行条件, 列名]
- 支持条件筛选
- 支持列名
- 最安全、最常用
df.loc[df['age']>18, 'score']
方法2:iloc —— 按【数字位置】定位
df.iloc[第几行, 第几列]
例子:
df.iloc[0, 1] # 第0行,第1列
df.iloc[0:3, :] # 前3行,所有列
方法3:[] —— 直接选列
df['列名']
df[['列1','列2']]
方法4:at —— 快速取单个值
df.at[索引, 列名]
比 loc 更快,但只能取一个格子
方法5:iat —— 按位置取单个值
df.iat[行号, 列号]
四、 复杂的例子:多条件筛选 + 多列同时赋值
# 多条件 + 多列
train.loc[ 条件1 & 条件2 & 条件3 , [列1, 列2, 列3] ] = 统一值
# 或 按列分别赋值
train.loc[ 条件 , [列A,列B] ] = (值A, 值B)
场景:用户数据表
import pandas as pd
data = {
'card_id': ['A','B','C','D','E'],
'age': [22, 35, 45, 28, 55],
'income': [20, 80, 120, 30, 150],
'target': [-10, -35, -5, -40, 0],
'risk': [0,0,0,0,0],
'level': ['','','','','']
}
train = pd.DataFrame(data)
需求(复杂):
同时满足 3 个条件 的行:
age < 30income < 50target < -30
对 2 列同时赋值:
risk列 = 1level列 = ‘高风险’
代码写法(标准复杂 loc)
# 1. 写多个筛选条件(必须加括号!)
cond = (train['age'] < 30) & \
(train['income'] < 50) & \
(train['target'] < -30)
# 2. 多列用 [ ] 列表包起来
train.loc[cond, ['risk', 'level']] = (1, '高风险')
结果
只有 D 行 满足全部条件:
| card_id | age | income | target | risk | level |
|---|---|---|---|---|---|
| A | 22 | 20 | -10 | 0 | |
| B | 35 | 80 | -35 | 0 | |
| C | 45 | 120 | -5 | 0 | |
| D | 28 | 30 | -40 | 1 | 高风险 |
| E | 55 | 150 | 0 | 0 |
必须记住的 3 条铁律(否则报错)
-
多个条件必须加括号
()(a>1) & (b<2) ✅ a>1 & b<2 ❌ -
且用 &,或用 |
且:& 或:| -
多列必须放列表
[]里['risk','level'] ✅ 'risk','level' ❌
再来一个例:分别赋值
# 对满足条件的行,设定:
# risk = 1
# level = '高风险'
# limit = 0
train.loc[cond, ['risk','level','limit']] = (1, '高风险', 0)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)