loc基于标签选择数据,iloc基于整数位置;前者切片包含结束值,适用于有业务含义的索引,后者切片不包含结束值,适合按位置批量操作。

Pandas中的
loc
iloc
loc
iloc
loc
iloc
要深入理解
loc
iloc
loc
loc
df.loc[行标签, 列标签]
立即学习“Python免费学习笔记(深入)”;
df.loc['row_label_1', 'col_A']
df.loc[['row_label_1', 'row_label_2'], ['col_A', 'col_B']]
df.loc['start_label':'end_label']
end_label
loc
df.loc[df['col_A'] > 10]
col_A
举个例子:
import pandas as pd
import numpy as np
# 创建一个带有自定义索引和列名的数据框
data = {
'A': [10, 20, 30, 40, 50],
'B': [1, 2, 3, 4, 5],
'C': [100, 200, 300, 400, 500]
}
index_labels = ['r1', 'r2', 'r3', 'r4', 'r5']
df = pd.DataFrame(data, index=index_labels)
print("原始DataFrame:\n", df)
# 1. 选择单行单列
print("\nloc: 选择'r2'行和'B'列:\n", df.loc['r2', 'B']) # 输出:2
# 2. 选择多行多列
print("\nloc: 选择'r1'到'r3'行和'A'到'C'列:\n", df.loc['r1':'r3', 'A':'C'])
# 注意,'r3'和'C'都被包含在内
# 3. 使用布尔索引
print("\nloc: 选择'A'列大于20的所有行:\n", df.loc[df['A'] > 20])iloc
iloc
df.iloc[行位置, 列位置]
df.iloc[0:3]
iloc
继续上面的例子:
# 1. 选择单行单列
print("\niloc: 选择第1行(索引为0)和第2列(索引为1):\n", df.iloc[0, 1]) # 输出:10 (df.iloc[0,1] 对应 'r1', 'B')
# 2. 选择多行多列
print("\niloc: 选择第0到2行(不包含第3行)和第0到1列(不包含第2列):\n", df.iloc[0:3, 0:2])
# 对应 'r1', 'r2', 'r3' 行 和 'A', 'B' 列
# 3. 使用负数索引
print("\niloc: 选择最后一行和最后一列:\n", df.iloc[-1, -1]) # 输出:500我个人觉得,当你拿到一个新数据集,想快速预览前几行或者某个特定位置的数据时,
iloc
loc
loc
iloc
这确实是很多初学者会感到困惑的地方,我自己也曾在这里栽过跟头。问题核心在于,当你的DataFrame索引本身就是整数时,比如
0, 1, 2, ...
loc
iloc
0, 1, 2, ...
loc
[10, 20, 30]
df.loc[20]
20
iloc
df.iloc[2]
来看一个具体的例子,这能更好地说明问题:
data_custom_index = {
'Value': [100, 200, 300, 400]
}
custom_index = [1, 3, 5, 7] # 自定义整数索引
df_custom = pd.DataFrame(data_custom_index, index=custom_index)
print("带有自定义整数索引的DataFrame:\n", df_custom)
# 尝试用loc和iloc选择
print("\ndf_custom.loc[3]:\n", df_custom.loc[3]) # 选择标签为3的行
# print(df_custom.loc[2]) # 这一行会报错,因为没有标签为2的行
print("\ndf_custom.iloc[1]:\n", df_custom.iloc[1]) # 选择位置为1(即第二行)的行
# 看看它们的不同
print("\ndf_custom.loc[3]['Value']:", df_custom.loc[3]['Value']) # 输出 200
print("df_custom.iloc[1]['Value']:", df_custom.iloc[1]['Value']) # 输出 200
# 结果一样是因为碰巧了,但它们的逻辑完全不同
# 如果我们想取第0行的值(标签为1)
print("\ndf_custom.loc[1]['Value']:", df_custom.loc[1]['Value']) # 输出 100
print("df_custom.iloc[0]['Value']:", df_custom.iloc[0]['Value']) # 输出 100
# 重点来了:
# 如果我想要取标签为 5 的那一行,我用 loc[5]
print("\nloc选择标签为5的行:\n", df_custom.loc[5])
# 如果我想要取第 2 个位置(从0开始计数,也就是第三行)的那一行,我用 iloc[2]
print("\niloc选择位置为2的行:\n", df_custom.iloc[2])
# 它们在数值上是等价的,但概念上完全不同。
# loc 找的是索引值等于 5 的那一行,而 iloc 找的是 DataFrame 内部存储顺序上的第三行。这种区别在数据被重新排序后尤为明显。如果你的DataFrame被排序了,
iloc
loc
loc
iloc
选择
loc
iloc
loc
loc
loc
df.loc['2023-10-15']
iloc
iloc
df.iloc[0:10]
df.iloc[:, :-2]
loc
loc
df.loc[df['Sales'] > 1000, ['Product', 'Price']]
iloc
iloc
我个人的经验是,在大部分业务分析场景下,我会倾向于使用
loc
iloc
loc
iloc
即便你已经理解了
loc
iloc
常见陷阱:
切片行为的差异: 这是最常见的陷阱之一。
loc
df.loc['A':'C']
iloc
df.iloc[0:3]
SettingWithCopyWarning
df['col_A'][df['col_B'] > 10] = value
loc
iloc
df.loc[df['col_B'] > 10, 'col_A'] = value
.copy()
整数索引的模糊性: 当DataFrame的索引恰好是
0, 1, 2, ...
df.loc[0]
df.iloc[0]
单元素选择返回Series: 当你使用
loc
iloc
df.loc[['label']]
最佳实践:
优先使用loc
明确指定行和列。 即使你只想选择所有行或所有列,也建议明确使用
:
df.loc[:, 'col_A']
df['col_A']
loc
避免链式索引进行赋值。 这一点和
SettingWithCopyWarning
loc
iloc
理解你的索引。 在处理数据之前,花点时间检查DataFrame的索引类型和内容。
df.index
df.columns
在需要时使用.copy()
.copy()
df_copy = df.loc[df['col_A'] > 10].copy()
通过遵循这些原则,你不仅能更有效地利用
loc
iloc
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号