使用loc和使用方括号来过滤Pandas / Python中的列有什么区别?

时间:2018-01-23 19:11:26

标签: python pandas dataframe

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

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

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

第二种方法 - 看似简单快捷:

df_new = df['col1']

第三种方法 - 最方便:

df_new = df.col1

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

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

3 个答案:

答案 0 :(得分:30)

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

  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切片行,而不是{{1假设你有一个RandeIndex,你会得到第1,2和3行。详见here。)
  4. 但是,iloc在以下情况下不起作用:

    1. 您可以使用[]
    2. 选择一行
    3. 您可以选择df.loc[row_label]
    4. 的行列表
    5. 您可以使用df.loc[[row_label1, row_label2]]
    6. 对列进行切片

      df.loc[:, 'A':'C']无法完成这三项工作。 更重要的是,如果您的选择涉及行和列,那么分配就会出现问题。

      []

      这将选择第1行和第2行,然后选择返回对象的列“A”并为其指定值5。问题是,返回的对象可能是一个副本,因此这可能不会更改实际的DataFrame。这提高了SettingWithCopyWarning。这项任务的正确方法是

      df[1:3]['A'] = 5
      

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

      另请注意,这两个未同时包含在API中。 df.loc[[1, 2, 5]]之后被添加为更强大,更明确的索引器。有关详细信息,请参阅unutbu's answer

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

答案 1 :(得分:2)

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']

答案 2 :(得分:0)

当创建具有多列的数据框时,df.loc []和df []之间似乎有所不同。

您可以参考以下问题: Is there a nice way to generate multiple columns using .loc?

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