在以下情况下,它们的行为相同:
- 选择单个列(
df['A']
与df.loc[:, 'A']
->选择列A相同) - 选择列列表(
df[['A', 'B', 'C']]
与df.loc[:, ['A', 'B', 'C']]
->选择列A,B和C相同) - 按行切片(
df[1:3]
与df.iloc[1:3]
->选择第1行和第2行相同。但是,请注意,如果使用loc
而不是进行切片,则iloc
假设您具有RandeIndex,则将获得第1、2和3行。请参见此处的详细信息。)
但是,
[]在以下情况下不起作用:
- 您可以使用
df.loc[row_label]
- 您可以使用
df.loc[[row_label1, row_label2]]
- 您可以使用
df.loc[:, 'A':'C']
这三个不能用来完成
[]。更重要的是,如果您的选择同时涉及到行和列,那么分配就会成问题。
df[1:3]['A'] = 5
这将选择行1和2,然后选择返回对象的列“ A”并为其分配值5。问题是,返回的对象可能是副本,因此这可能不会更改实际的Dataframe。这将引发
SettingWithCopyWarning。这种分配的正确方法是
df.loc[1:3, 'A'] = 5
使用
.loc,可以确保修改原始Dataframe。它还允许您对列(
df.loc[:,'C':'F'])进行切片,选择单行(
df.loc[5])和选择行列表(
df.loc[[1, 2, 5]])。
另请注意,这两个未同时包含在API中。
.loc后来被添加为更强大,更明确的索引器。有关更多详细信息,请参见unutbu的答案。
注意:使用
[]vs获取列
.是一个完全不同的主题。
.只是为了方便。它仅允许访问其名称为有效Python标识符的列(即它们不能包含空格,它们不能由数字组成…)。当名称与Series
/ Dataframe方法冲突时,不能使用它。它也不能用于不存在的列(即,
df.a = 1如果没有column
,分配将不起作用
a)。除此之外,
.并且
[]是相同的。



