当前位置:首页 > Python > 正文

Python中loc函数用法详解 - pandas数据选择指南

Python中loc函数用法详解

什么是loc函数?

在pandas库中,loc函数是一种基于标签的数据选择方法,用于从DataFrame或Series中精确地选择数据子集。

与iloc(基于整数位置索引)不同,loc使用行和列的标签进行数据选择,使代码更易读、更直观。

基本语法

loc函数的基本语法如下:

dataframe.loc[row_selection, column_selection]

其中:

  • row_selection:行的选择条件(标签、标签列表、切片或布尔数组)
  • column_selection:列的选择条件(同上)

创建示例DataFrame

在演示loc用法前,我们先创建一个示例DataFrame:

import pandas as pd data = { '姓名': ['张三', '李四', '王五', '赵六', '钱七'], '年龄': [25, 32, 28, 35, 29], '城市': ['北京', '上海', '广州', '深圳', '杭州'], '薪资': [15000, 22000, 18000, 28000, 21000] } df = pd.DataFrame(data, index=['A001', 'A002', 'A003', 'A004', 'A005']) print(df)

该DataFrame显示如下:

姓名 年龄 城市 薪资
A001 张三 25 北京 15000
A002 李四 32 上海 22000
A003 王五 28 广州 18000
A004 赵六 35 深圳 28000
A005 钱七 29 杭州 21000

选择单行或多行

使用行标签选择特定行:

# 选择单行 print(df.loc['A002']) # 输出: # 姓名 李四 # 年龄 32 # 城市 上海 # 薪资 22000 # Name: A002, dtype: object
# 选择多行(使用列表) print(df.loc[['A001', 'A004']]) # 输出: # 姓名 年龄 城市 薪资 # A001 张三 25 北京 15000 # A004 赵六 35 深圳 28000
# 使用切片选择连续的行(包含结束位置) print(df.loc['A002':'A004']) # 输出: # 姓名 年龄 城市 薪资 # A002 李四 32 上海 22000 # A003 王五 28 广州 18000 # A004 赵六 35 深圳 28000

选择单列或多列

在loc中指定列选择:

# 选择单列(所有行) print(df.loc[:, '城市']) # 输出: # A001 北京 # A002 上海 # A003 广州 # A004 深圳 # A005 杭州 # Name: 城市, dtype: object
# 选择多列 print(df.loc[:, ['姓名', '薪资']]) # 输出: # 姓名 薪资 # A001 张三 15000 # A002 李四 22000 # A003 王五 18000 # A004 赵六 28000 # A005 钱七 21000
# 使用列切片 print(df.loc[:, '姓名':'城市']) # 输出: # 姓名 年龄 城市 # A001 张三 25 北京 # A002 李四 32 上海 # A003 王五 28 广州 # A004 赵六 35 深圳 # A005 钱七 29 杭州

同时选择行和列

组合行和列选择:

# 选择特定行和列 print(df.loc[['A001', 'A003'], ['姓名', '年龄']]) # 输出: # 姓名 年龄 # A001 张三 25 # A003 王五 28
# 使用行切片和列选择 print(df.loc['A002':'A004', '城市':'薪资']) # 输出: # 城市 薪资 # A002 上海 22000 # A003 广州 18000 # A004 深圳 28000

条件选择

使用布尔条件进行高级筛选:

# 选择薪资大于20000的所有行 print(df.loc[df['薪资'] > 20000]) # 输出: # 姓名 年龄 城市 薪资 # A002 李四 32 上海 22000 # A004 赵六 35 深圳 28000 # A005 钱七 29 杭州 21000
# 多条件筛选(使用 & 和 |) # 选择年龄在30岁以下且薪资大于20000的员工 print(df.loc[(df['年龄'] < 30) & (df['薪资'] > 20000)]) # 输出: # 姓名 年龄 城市 薪资 # A005 钱七 29 杭州 21000
# 条件选择特定列 # 选择所有上海员工的姓名和薪资 print(df.loc[df['城市'] == '上海', ['姓名', '薪资']]) # 输出: # 姓名 薪资 # A002 李四 22000

使用loc修改数据

loc不仅可以查询数据,还可以用于修改数据:

# 修改单个值 df.loc['A001', '薪资'] = 16000 print(df.loc['A001']) # 输出: # 姓名 张三 # 年龄 25 # 城市 北京 # 薪资 16000
# 修改整列 df.loc[:, '年龄'] = df['年龄'] + 1 print(df['年龄']) # 输出: # A001 26 # A002 33 # A003 29 # A004 36 # A005 30
# 条件修改 # 给所有薪资低于20000的员工加薪10% df.loc[df['薪资'] < 20000, '薪资'] = df['薪资'] * 1.1 print(df) # 输出: # 姓名 年龄 城市 薪资 # A001 张三 26 北京 17600.0 # A002 李四 33 上海 22000.0 # A003 王五 29 广州 19800.0 # A004 赵六 36 深圳 28000.0 # A005 钱七 30 杭州 21000.0

loc与iloc的区别

特性 loc iloc
索引类型 基于标签 基于整数位置
切片行为 包含结束位置 不包含结束位置
索引方式 使用行/列名 使用行/列序号
布尔索引 支持 支持
修改数据 支持 支持
适用场景 有意义标签的数据集 无意义标签或需要位置索引

最佳实践与注意事项

避免链式赋值

不要使用以下方式修改数据,可能会导致不可预测的结果:

# 不推荐的方式(链式赋值) df['薪资'][df['城市'] == '北京'] = 18000 # 推荐使用loc df.loc[df['城市'] == '北京', '薪资'] = 18000

设置新索引

如果DataFrame没有有意义的索引,可以使用set_index创建:

# 设置"姓名"列为索引 df.set_index('姓名', inplace=True)

处理重复索引

当索引有重复值时,loc选择会返回所有匹配项:

# 如果有重复索引 df.loc['A001'] # 可能返回多个结果

总结

pandas的loc函数是数据处理中不可或缺的工具,主要特点包括:

  • 基于标签的数据选择方法
  • 支持单行/列、多行/列、切片和布尔索引
  • 可用于数据查询和修改
  • 比链式索引更安全可靠
  • 特别适合处理具有有意义索引的数据集

掌握loc函数的使用,可以大大提高数据处理的效率和代码可读性。

发表评论