python - 在 Pandas/Python 中使用 loc 和仅使用方括号过滤列有什么区别?

标签 python pandas dataframe

我注意到在 Pandas DataFrame 中选择列的三种方法:

第一种使用 loc 选择列的方法:

df_new = df.loc[:, 'col1']

第二种方法 - 似乎更简单更快:

df_new = df['col1']

第三种方法——最方便:

df_new = df.col1

这三种方法有区别吗?我不这么认为,在这种情况下我宁愿使用第三种方法。

我很好奇为什么似乎有三种方法可以做同样的事情。

最佳答案

在以下情况下,它们的行为相同:

  1. 选择单个列(df['A']df.loc[:, 'A'] 相同 -> 选择 A 列)
  2. 选择列列表(df[['A', 'B', 'C']]df.loc[:, ['A', 'B', 'C']] 相同 -> 选择列 A、B 和 C)
  3. 按行切片( df[1:3]df.iloc[1:3] 相同 -> 选择第 1 行和第 2 行。但是请注意,如果您使用 loc 而非 iloc 对行进行切片,您将获得第 1 行, 2 和 3 假设你有一个 RangeIndex 。查看详细信息 here 。)

但是,[]在以下情况下不起作用:

  1. 您可以使用 df.loc[row_label] 选择单行
  2. 您可以使用 df.loc[[row_label1, row_label2]] 选择行列表
  3. 您可以使用 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/

相关文章:

javascript - 垂直显示表头内容

python - 将函数应用于 Pandas.DataFrame 中两列的每个组合的更好方法

python - 在Python中按数据帧的列中的每个值进行分组

r - 数据集的 dplyr 字符串突变问题

python - 如果列为 NaN 并且另一行的列不是 NaN,如何删除 Dataframe 中的行

python - 如何在 PyQt 中动态创建列和行?

python - tkinter 中的新窗口标题

python - 为什么我无法验证通过自定义管理.py 命令创建的 Django 用户?

python - 使用 numpy.max/numpy.min 作为时间戳值

python - JSON 提取到 pandas 数据帧