在Pandas/Python中使用loc和只使用方括号过滤列之间有什么区别?
我注意到在数据框中选择列的三种方法: 使用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
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()
仍然很幸运地工作)所以第三条道路应该被视为一条捷径,这很好,但需要小心,这里有一个合理的解释