简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

Python pandas数据分析库中如何使用iloc和loc等方法轻松输出数据框中的特定行数据详解与实例应用

3万

主题

317

科技点

3万

积分

大区版主

木柜子打湿

积分
31893

财Doro三倍冰淇淋无人之境【一阶】立华奏小樱(小丑装)⑨的冰沙以外的星空【二阶】

发表于 2025-10-3 22:30:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

Python的pandas库是数据科学领域最常用的工具之一,它提供了强大的数据结构和数据分析功能。在处理数据时,经常需要从数据框(DataFrame)中选择特定的行或列,这是数据分析的基础操作。pandas提供了多种方法来实现这一目的,其中最常用的是loc和iloc方法。本文将详细介绍这些方法的使用原理、语法规则,并通过丰富的实例展示如何在实际数据分析中灵活运用这些方法来提取所需数据。

pandas数据框基础

在深入了解数据选择方法之前,我们先简要回顾一下pandas的DataFrame结构。DataFrame是pandas中最常用的数据结构,类似于电子表格或SQL表,它由行和列组成,可以存储不同类型的数据。
  1. import pandas as pd
  2. import numpy as np
  3. # 创建一个简单的DataFrame
  4. data = {
  5.     '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
  6.     '年龄': [25, 30, 35, 40, 45],
  7.     '性别': ['男', '女', '男', '女', '男'],
  8.     '城市': ['北京', '上海', '广州', '深圳', '杭州'],
  9.     '薪资': [8000, 12000, 15000, 18000, 20000]
  10. }
  11. df = pd.DataFrame(data)
  12. print(df)
复制代码

输出结果:
  1. 姓名  年龄 性别  城市     薪资
  2. 0  张三  25  男  北京   8000
  3. 1  李四  30  女  上海  12000
  4. 2  王五  35  男  广州  15000
  5. 3  赵六  40  女  深圳  18000
  6. 4  钱七  45  男  杭州  20000
复制代码

这个DataFrame有5行(索引为0到4)和5列。现在,让我们详细介绍如何使用各种方法从这个DataFrame中选择特定的行数据。

loc方法详解

基本概念

loc是”location”的缩写,是基于标签(label)的数据选择方法。它允许我们通过行标签和列标签来选择数据。loc的主要特点包括:

1. 使用标签(行名和列名)进行索引
2. 支持布尔索引
3. 可以接受切片对象
4. 包含起始和结束索引(即切片是包含两端的)

基本语法

loc的基本语法是:
  1. df.loc[row_indexer, column_indexer]
复制代码

其中:

• row_indexer:行索引器,可以是单个标签、标签列表、标签切片或布尔数组
• column_indexer:列索引器,可以是单个标签、标签列表、标签切片或布尔数组(可选)

使用示例
  1. # 选择索引为2的行
  2. row_2 = df.loc[2]
  3. print(row_2)
复制代码

输出:
  1. 姓名    王五
  2. 年龄    35
  3. 性别     男
  4. 城市    广州
  5. 薪资    15000
  6. Name: 2, dtype: object
复制代码
  1. # 选择索引为1和3的行
  2. rows_1_3 = df.loc[[1, 3]]
  3. print(rows_1_3)
复制代码

输出:
  1. 姓名  年龄 性别  城市     薪资
  2. 1  李四  30  女  上海  12000
  3. 3  赵六  40  女  深圳  18000
复制代码
  1. # 选择索引从1到3(包含3)的行
  2. rows_1_to_3 = df.loc[1:3]
  3. print(rows_1_to_3)
复制代码

输出:
  1. 姓名  年龄 性别  城市     薪资
  2. 1  李四  30  女  上海  12000
  3. 2  王五  35  男  广州  15000
  4. 3  赵六  40  女  深圳  18000
复制代码
  1. # 选择索引为1和3的行,以及'姓名'和'薪资'列
  2. specific_rows_cols = df.loc[[1, 3], ['姓名', '薪资']]
  3. print(specific_rows_cols)
复制代码

输出:
  1. 姓名     薪资
  2. 1  李四  12000
  3. 3  赵六  18000
复制代码
  1. # 选择年龄大于35的行
  2. age_over_35 = df.loc[df['年龄'] > 35]
  3. print(age_over_35)
复制代码

输出:
  1. 姓名  年龄 性别  城市     薪资
  2. 3  赵六  40  女  深圳  18000
  3. 4  钱七  45  男  杭州  20000
复制代码
  1. # 选择年龄大于30且薪资大于15000的行
  2. complex_condition = df.loc[(df['年龄'] > 30) & (df['薪资'] > 15000)]
  3. print(complex_condition)
复制代码

输出:
  1. 姓名  年龄 性别  城市     薪资
  2. 3  赵六  40  女  深圳  18000
  3. 4  钱七  45  男  杭州  20000
复制代码

自定义索引的示例

让我们创建一个具有自定义索引的DataFrame,看看loc如何处理:
  1. # 创建自定义索引的DataFrame
  2. df_custom = df.set_index('姓名')
  3. print(df_custom)
复制代码

输出:
  1. 年龄 性别  城市     薪资
  2. 姓名                    
  3. 张三   25  男  北京   8000
  4. 李四   30  女  上海  12000
  5. 王五   35  男  广州  15000
  6. 赵六   40  女  深圳  18000
  7. 钱七   45  男  杭州  20000
复制代码

现在,我们可以使用姓名作为行标签:
  1. # 选择姓名为'王五'的行
  2. row_wangwu = df_custom.loc['王五']
  3. print(row_wangwu)
复制代码

输出:
  1. 年龄    35
  2. 性别     男
  3. 城市    广州
  4. 薪资    15000
  5. Name: 王五, dtype: object
复制代码
  1. # 选择姓名为'李四'和'赵六'的行
  2. rows_lizhao = df_custom.loc[['李四', '赵六']]
  3. print(rows_lizhao)
复制代码

输出:
  1. 年龄 性别  城市     薪资
  2. 姓名                    
  3. 李四   30  女  上海  12000
  4. 赵六   40  女  深圳  18000
复制代码

iloc方法详解

基本概念

iloc是”integer location”的缩写,是基于整数位置的数据选择方法。它允许我们通过行号和列号的整数位置来选择数据,类似于Python中的列表切片。iloc的主要特点包括:

1. 使用整数位置进行索引(从0开始)
2. 支持整数列表、切片和布尔数组
3. 切片不包含结束索引(即切片是左闭右开的)

基本语法

iloc的基本语法是:
  1. df.iloc[row_indexer, column_indexer]
复制代码

其中:

• row_indexer:行索引器,可以是整数、整数列表、切片或布尔数组
• column_indexer:列索引器,可以是整数、整数列表、切片或布尔数组(可选)

使用示例
  1. # 选择第2行(索引为1,因为从0开始)
  2. row_1 = df.iloc[1]
  3. print(row_1)
复制代码

输出:
  1. 姓名    李四
  2. 年龄    30
  3. 性别     女
  4. 城市    上海
  5. 薪资    12000
  6. Name: 1, dtype: object
复制代码
  1. # 选择第1行和第3行(索引为0和2)
  2. rows_0_2 = df.iloc[[0, 2]]
  3. print(rows_0_2)
复制代码

输出:
  1. 姓名  年龄 性别  城市     薪资
  2. 0  张三  25  男  北京   8000
  3. 2  王五  35  男  广州  15000
复制代码
  1. # 选择第2行到第4行(索引为1到3,不包含4)
  2. rows_1_to_3 = df.iloc[1:4]
  3. print(rows_1_to_3)
复制代码

输出:
  1. 姓名  年龄 性别  城市     薪资
  2. 1  李四  30  女  上海  12000
  3. 2  王五  35  男  广州  15000
  4. 3  赵六  40  女  深圳  18000
复制代码

注意:与loc不同,iloc的切片不包含结束索引。
  1. # 选择第2行到第4行,以及第1列和第4列(索引为1到3,列索引为0和3)
  2. specific_rows_cols = df.iloc[1:4, [0, 3]]
  3. print(specific_rows_cols)
复制代码

输出:
  1. 姓名  城市
  2. 1  李四  上海
  3. 2  王五  广州
  4. 3  赵六  深圳
复制代码
  1. # 选择所有奇数行(索引为1, 3)
  2. odd_rows = df.iloc[1::2]
  3. print(odd_rows)
复制代码

输出:
  1. 姓名  年龄 性别  城市     薪资
  2. 1  李四  30  女  上海  12000
  3. 3  赵六  40  女  深圳  18000
复制代码
  1. # 创建一个布尔数组,选择第1、3、4行
  2. bool_array = [True, False, True, True, False]
  3. bool_selection = df.iloc[bool_array]
  4. print(bool_selection)
复制代码

输出:
  1. 姓名  年龄 性别  城市     薪资
  2. 0  张三  25  男  北京   8000
  3. 2  王五  35  男  广州  15000
  4. 3  赵六  40  女  深圳  18000
复制代码

其他数据选择方法

除了loc和iloc,pandas还提供了其他一些数据选择方法,如at、iat和ix(已弃用)。

at方法

at方法用于快速获取单个值,它是loc的优化版本,专门用于访问单个值。
  1. # 获取索引为2的行的'姓名'列的值
  2. name_at_2 = df.at[2, '姓名']
  3. print(name_at_2)  # 输出: 王五
复制代码

iat方法

iat方法用于通过整数位置快速获取单个值,它是iloc的优化版本,专门用于访问单个值。
  1. # 获取第3行(索引为2)第1列(索引为0)的值
  2. value_iat = df.iat[2, 0]
  3. print(value_iat)  # 输出: 王五
复制代码

ix方法(已弃用)

ix方法曾经是pandas中最常用的数据选择方法,它结合了loc和iloc的功能,可以根据标签或整数位置进行选择。然而,由于它的行为有时令人困惑,从pandas 0.20.0版本开始已被弃用,并在后续版本中被移除。现在推荐明确使用loc或iloc。

实际应用案例

让我们通过一个更实际的例子来展示这些方法的应用。假设我们有一个包含销售数据的DataFrame:
  1. # 创建销售数据DataFrame
  2. sales_data = {
  3.     '日期': pd.date_range(start='2023-01-01', periods=10),
  4.     '产品': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'B', 'A', 'C'],
  5.     '地区': ['东', '南', '西', '北', '东', '南', '西', '北', '东', '南'],
  6.     '销售额': [1200, 1500, 800, 2000, 1300, 900, 1700, 1100, 1400, 1600],
  7.     '销售员': ['张三', '李四', '王五', '赵六', '张三', '李四', '王五', '赵六', '张三', '李四']
  8. }
  9. sales_df = pd.DataFrame(sales_data)
  10. print(sales_df)
复制代码

输出:
  1. 日期 产品  地区   销售额 销售员
  2. 0 2023-01-01   A  东  1200  张三
  3. 1 2023-01-02   B  南  1500  李四
  4. 2 2023-01-03   A  西   800  王五
  5. 3 2023-01-04   C  北  2000  赵六
  6. 4 2023-01-05   B  东  1300  张三
  7. 5 2023-01-06   A  南   900  李四
  8. 6 2023-01-07   C  西  1700  王五
  9. 7 2023-01-08   B  北  1100  赵六
  10. 8 2023-01-09   A  东  1400  张三
  11. 9 2023-01-10   C  南  1600  李四
复制代码

案例1:筛选特定产品的销售记录
  1. # 使用loc筛选产品A的销售记录
  2. product_a = sales_df.loc[sales_df['产品'] == 'A']
  3. print(product_a)
复制代码

输出:
  1. 日期 产品  地区   销售额 销售员
  2. 0 2023-01-01   A  东  1200  张三
  3. 2 2023-01-03   A  西   800  王五
  4. 5 2023-01-06   A  南   900  李四
  5. 8 2023-01-09   A  东  1400  张三
复制代码

案例2:筛选销售额在特定范围内的记录
  1. # 使用loc筛选销售额大于等于1500的记录
  2. high_sales = sales_df.loc[sales_df['销售额'] >= 1500]
  3. print(high_sales)
复制代码

输出:
  1. 日期 产品  地区   销售额 销售员
  2. 1 2023-01-02   B  南  1500  李四
  3. 3 2023-01-04   C  北  2000  赵六
  4. 6 2023-01-07   C  西  1700  王五
  5. 9 2023-01-10   C  南  1600  李四
复制代码

案例3:筛选特定销售员在特定地区的销售记录
  1. # 使用loc筛选张三在东区的销售记录
  2. zhangsan_east = sales_df.loc[(sales_df['销售员'] == '张三') & (sales_df['地区'] == '东')]
  3. print(zhangsan_east)
复制代码

输出:
  1. 日期 产品  地区   销售额 销售员
  2. 0 2023-01-01   A  东  1200  张三
  3. 4 2023-01-05   B  东  1300  张三
  4. 8 2023-01-09   A  东  1400  张三
复制代码

案例4:选择特定日期范围内的记录
  1. # 将日期列设为索引
  2. sales_df_date = sales_df.set_index('日期')
  3. # 使用loc选择2023-01-03到2023-01-07的记录
  4. date_range = sales_df_date.loc['2023-01-03':'2023-01-07']
  5. print(date_range)
复制代码

输出:
  1. 产品  地区   销售额 销售员
  2. 日期                             
  3. 2023-01-03   A  西   800  王五
  4. 2023-01-04   C  北  2000  赵六
  5. 2023-01-05   B  东  1300  张三
  6. 2023-01-06   A  南   900  李四
  7. 2023-01-07   C  西  1700  王五
复制代码

案例5:使用iloc选择特定位置的记录
  1. # 使用iloc选择第3到第7行(索引为2到6),以及第1、3、4列
  2. specific_data = sales_df.iloc[2:7, [0, 2, 3]]
  3. print(specific_data)
复制代码

输出:
  1. 日期  地区   销售额
  2. 2 2023-01-03  西   800
  3. 3 2023-01-04  北  2000
  4. 4 2023-01-05  东  1300
  5. 5 2023-01-06  南   900
  6. 6 2023-01-07  西  1700
复制代码

案例6:使用query方法进行复杂查询

除了loc和iloc,pandas还提供了query方法,它允许我们使用字符串表达式进行查询:
  1. # 使用query方法筛选产品为A或C,且销售额大于1000的记录
  2. complex_query = sales_df.query("(产品 == 'A' or 产品 == 'C') and 销售额 > 1000")
  3. print(complex_query)
复制代码

输出:
  1. 日期 产品  地区   销售额 销售员
  2. 0 2023-01-01   A  东  1200  张三
  3. 3 2023-01-04   C  北  2000  赵六
  4. 6 2023-01-07   C  西  1700  王五
  5. 8 2023-01-09   A  东  1400  张三
  6. 9 2023-01-10   C  南  1600  李四
复制代码

性能比较和最佳实践

性能比较

在选择数据时,不同的方法可能有不同的性能表现。一般来说:

1. at和iat是访问单个值的最快方法
2. loc和iloc在访问多个值时性能良好
3. 布尔索引在大数据集上可能比列表索引更高效

让我们进行一个简单的性能比较:
  1. import timeit
  2. # 创建一个较大的DataFrame
  3. large_df = pd.DataFrame(np.random.rand(10000, 5), columns=['A', 'B', 'C', 'D', 'E'])
  4. # 定义测试函数
  5. def test_loc():
  6.     return large_df.loc[0:9999, 'A']
  7. def test_iloc():
  8.     return large_df.iloc[0:10000, 0]
  9. def test_at():
  10.     result = []
  11.     for i in range(10000):
  12.         result.append(large_df.at[i, 'A'])
  13.     return result
  14. def test_iat():
  15.     result = []
  16.     for i in range(10000):
  17.         result.append(large_df.iat[i, 0])
  18.     return result
  19. # 测试性能
  20. loc_time = timeit.timeit(test_loc, number=100)
  21. iloc_time = timeit.timeit(test_iloc, number=100)
  22. at_time = timeit.timeit(test_at, number=10)  # 减少次数因为at方法较慢
  23. iat_time = timeit.timeit(test_iat, number=10)  # 减少次数因为iat方法较慢
  24. print(f"loc方法时间: {loc_time:.5f}秒")
  25. print(f"iloc方法时间: {iloc_time:.5f}秒")
  26. print(f"at方法时间: {at_time:.5f}秒 (执行次数为10)")
  27. print(f"iat方法时间: {iat_time:.5f}秒 (执行次数为10)")
复制代码

输出结果可能因运行环境而异,但通常情况下,iloc会比loc稍快,而at和iat在访问单个值时更快,但在循环中多次使用时可能比批量操作慢。

最佳实践

1. 明确使用场景:当需要基于标签选择数据时,使用loc当需要基于整数位置选择数据时,使用iloc当只需要访问单个值时,使用at或iat
2. 当需要基于标签选择数据时,使用loc
3. 当需要基于整数位置选择数据时,使用iloc
4. 当只需要访问单个值时,使用at或iat
5.
  1. 避免链式索引:
  2. 链式索引(如df['A'][0])可能导致不可预测的结果和性能问题。推荐使用loc或iloc:
  3. “`python不推荐value = df[‘A’][0]
复制代码

明确使用场景:

• 当需要基于标签选择数据时,使用loc
• 当需要基于整数位置选择数据时,使用iloc
• 当只需要访问单个值时,使用at或iat

避免链式索引:
链式索引(如df['A'][0])可能导致不可预测的结果和性能问题。推荐使用loc或iloc:
“`python

value = df[‘A’][0]

# 推荐
   value = df.loc[0, ‘A’]
   value = df.iloc[0, 0]
  1. 3. **使用布尔索引进行复杂筛选**:
  2.    ```python
  3.    # 不推荐
  4.    result = df.loc[(df['A'] > 0.5).values & (df['B'] < 0.5).values]
  5.    
  6.    # 推荐
  7.    result = df.loc[(df['A'] > 0.5) & (df['B'] < 0.5)]
复制代码

1.
  1. 考虑使用query方法进行复杂查询:
  2. “`python使用locresult = df.loc[(df[‘A’] > 0.5) & (df[‘B’] < 0.5) & (df[‘C’] == ‘value’)]
复制代码

考虑使用query方法进行复杂查询:
“`python

result = df.loc[(df[‘A’] > 0.5) & (df[‘B’] < 0.5) & (df[‘C’] == ‘value’)]

# 使用query可能更清晰
   result = df.query(“A > 0.5 and B < 0.5 and C == ‘value’”)
   “`

1. 大数据集上的性能考虑:对于大数据集,避免在循环中使用at或iat,而是使用向量化操作如果需要多次访问相同的数据,考虑将其存储在变量中
2. 对于大数据集,避免在循环中使用at或iat,而是使用向量化操作
3. 如果需要多次访问相同的数据,考虑将其存储在变量中

• 对于大数据集,避免在循环中使用at或iat,而是使用向量化操作
• 如果需要多次访问相同的数据,考虑将其存储在变量中

总结

在Python pandas数据分析库中,loc和iloc是两个非常重要的数据选择方法,它们各有特点:

• loc基于标签进行选择,使用行名和列名,切片包含两端
• iloc基于整数位置进行选择,使用行号和列号,切片不包含结束索引

除了这两个主要方法,pandas还提供了at和iat用于快速访问单个值,以及query方法用于使用字符串表达式进行复杂查询。

在实际应用中,选择合适的方法取决于具体的需求和数据结构。通过理解这些方法的工作原理和使用场景,我们可以更高效地从DataFrame中提取所需数据,为后续的数据分析和处理奠定基础。

掌握这些数据选择方法是pandas数据分析的基础,它们能够帮助我们更灵活、更高效地处理各种数据操作需求。希望本文的详细解释和丰富实例能够帮助读者更好地理解和应用这些方法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.