在Pandas/Python中使用loc和只使用方括号过滤列之间有什么区别?

在Pandas/Python中使用loc和只使用方括号过滤列之间有什么区别?,python,pandas,dataframe,Python,Pandas,Dataframe,我注意到在数据框中选择列的三种方法: 使用loc选择列的第一种方法: df_new = df.loc[:, 'col1'] df_new = df['col1'] df_new = df.col1 第二种方法-似乎更简单更快: df_new = df.loc[:, 'col1'] df_new = df['col1'] df_new = df.col1 第三种方法-最方便: df_new = df.loc[:, 'col1'] df_new = df['col1'] df_new

我注意到在数据框中选择列的三种方法:

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

df_new = df.loc[:, 'col1']
df_new = df['col1']
df_new = df.col1
第二种方法-似乎更简单更快:

df_new = df.loc[:, 'col1']
df_new = df['col1']
df_new = df.col1
第三种方法-最方便:

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行。请参阅详细信息。)
  • 但是,
    []
    在以下情况下不起作用:

  • 您可以使用
    df.loc[行标签]
  • 您可以选择带有
    df.loc[[row\u label1,row\u label2]]的行列表。
  • 您可以使用
    df.loc[:,'A':'C']
  • 使用
    []
    无法完成这三项操作。 更重要的是,如果您的选择同时涉及行和列,那么赋值就会有问题

    df[1:3]['A'] = 5
    
    这将选择第1行和第2行,然后选择返回对象的列“A”,并为其赋值5。问题是,返回的对象可能是副本,因此这可能不会更改实际的数据帧。这引起了人们的关注。完成此任务的正确方法是:

    df.loc[1:3, 'A'] = 5
    
    使用
    .loc
    ,您可以保证修改原始数据帧。它还允许您对列进行切片(
    df.loc[:,'C':'F']
    ),选择一行(
    df.loc[5]
    ),并选择行列表(
    df.loc[[1,2,5]]

    还要注意的是,API中没有同时包含这两个部分
    .loc
    作为一个更强大、更明确的索引器被添加了很久。有关更多详细信息,请参阅



    注意:使用
    []
    获取列是一个完全不同的主题<代码>仅为方便起见。它只允许访问名称为有效Python标识符的列(即它们不能包含空格,不能由数字组成…)。当名称与Series/DataFrame方法冲突时,不能使用它。它也不能用于不存在的列(即,如果没有列
    a
    ,则赋值
    df.a=1
    将不起作用)。除此之外,
    []
    是相同的。

    loc
    在索引不是数字时特别有用(例如DatetimeIndex),因为您可以从索引中获取具有特定标签的行:

    df.loc['2010-05-04 07:00:00']
    df.loc['2010-1-1 0:00:00':'2010-12-31 23:59:59 ','Price']
    
    但是,
    []
    旨在获取具有特定名称的列:

    df['Price']
    
    使用
    []
    您还可以筛选行,但更为详细:

    df[df['Date'] < datetime.datetime(2010,1,1,7,0,0)]['Price']
    
    df[df['Date']
    当您使用多列创建数据帧时,df.loc[]和df[]之间似乎存在差异

    你可以参考这个问题:


    在这里,您不能使用
    df.loc[:,['name1','name2']]
    生成多个列,但您可以只使用双括号
    df['name1','name2']
    。(我想知道他们为什么表现不同。)

    或者
    df.col1
    呢?对于选择列的非常简单的情况,这三种方法基本上是等效的
    .loc
    可以让您做的不仅仅是选择一列。对于简单的切片,它们可能重复执行相同的操作。loc更明确,尤其是当您的列是数字时。谢谢@juanpa.arrivillaga。很好的一点是re:df.col1,这是另一种列选择方法。事实上,我之前已经看过其他问题好几次了。这对于解释loc和iloc非常有用。然而,这个问题是关于另一种方法的:“df['col1']”。我只是不明白为什么有两种(或三种)等效的方法来做看起来相同的事情。第三种方法的最大缺点是,当您的列名与现有的属性或方法相同时,它是不明确的。例如,您将一列命名为“sum”。然后,如果键入
    df.sum
    ,会发生什么?(剧透警报,没什么用处,尽管
    df.sum()
    仍然很幸运地工作)所以第三条道路应该被视为一条捷径,这很好,但需要小心,这里有一个合理的解释