我注意到在 Pandas DataFrame 中选择列的三种方法:
第一种使用 loc 选择列的方法:
df_new = df.loc[:, 'col1']
第二种方法 - 似乎更简单更快:
df_new = df['col1']
第三种方法——最方便:
df_new = df.col1
这三种方法有区别吗?我不这么认为,在这种情况下我宁愿使用第三种方法。
我很好奇为什么似乎有三种方法可以做同样的事情。
最佳答案
在以下情况下,它们的行为相同:
- 选择单个列(
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
对行进行切片,您将获得第 1 行, 2 和 3 假设你有一个 RangeIndex 。查看详细信息 here 。)
但是,[]
在以下情况下不起作用:
- 您可以使用
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's answer了解更多详情。
注意:使用 []
获取列与 .
是一个完全不同的话题。 .
只是为了方便。它只允许访问名称为有效 Python 标识符的列(即它们不能包含空格,它们不能由数字组成......)。当名称与 Series/DataFrame 方法冲突时,不能使用它。它也不能用于不存在的列(即分配 df.a = 1
如果没有列 a
将不起作用)。除此之外,.
和 []
是一样的。
关于python - 在 Pandas/Python 中使用 loc 和仅使用方括号过滤列有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48409128/