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:多条件筛选 + 多列赋值(竞赛高频)

还是上面的成绩表,要求

  1. 找出「语文≥80 且 数学≥80」的学生
  2. 给这些学生的 总分 加 10 分(加分项)
  3. 同时给他们新增一列 优秀学生,设为 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 个条件 的行:

  1. age < 30
  2. income < 50
  3. target < -30

对 2 列同时赋值

  • risk 列 = 1
  • level 列 = ‘高风险’

代码写法(标准复杂 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 条铁律(否则报错)

  1. 多个条件必须加括号 ()

    (a>1) & (b<2)  ✅
    a>1 & b<2
  2. 且用 &,或用 |

    且:&
    或:|
    
  3. 多列必须放列表 []

    ['risk','level']'risk','level'

再来一个例:分别赋值

# 对满足条件的行,设定:
# risk = 1
# level = '高风险'
# limit = 0
train.loc[cond, ['risk','level','limit']] = (1, '高风险', 0)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐