我注意到在Pandas DataFrame中选择列的三种方法:
使用loc选择列的第一种方法:
df_new = df.loc[:, 'col1']
第二种方法-看起来更简单,更快:
df_new = df['col1']
第三种方法-最方便:
df_new = df.col1
这三种方法之间有区别吗?我不这么认为,在这种情况下,我宁愿使用第三种方法。
我最奇怪的是为什么似乎有三种方法可以做同一件事。
我注意到在Pandas DataFrame中选择列的三种方法:
使用loc选择列的第一种方法:
df_new = df.loc[:, 'col1']
第二种方法-看起来更简单,更快:
df_new = df['col1']
第三种方法-最方便:
df_new = df.col1
这三种方法之间有区别吗?我不这么认为,在这种情况下,我宁愿使用第三种方法。
我最奇怪的是为什么似乎有三种方法可以做同一件事。
df.sum
,会发生什么?(扰流板警报,没什么用,尽管df.sum()
仍然可以幸运地起作用)所以第三种方法应该被视为是一种捷径,但是,请务必谨慎
Answers:
在以下情况下,它们的行为相同:
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
假设您具有RandeIndex,则将获得第1、2和3行。请参见此处的详细信息。) 但是,[]
在以下情况下不起作用:
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的答案。
注意:使用[]
vs获取列.
是一个完全不同的主题。.
只是为了方便。它仅允许访问其名称为有效Python标识符的列(即它们不能包含空格,它们不能由数字组成...)。当名称与Series / DataFrame方法冲突时,不能使用它。它也不能用于不存在的列(即,df.a = 1
如果没有column ,分配将不起作用a
)。除此之外,.
并且[]
是相同的。
创建具有多列的数据框时,df.loc []和df []之间似乎有所不同。
您可以参考以下问题: 是否有一种使用.loc生成多列的好方法?
在这里,您不能使用来生成多列,df.loc[:,['name1','name2']]
而只需使用doublecket即可df[['name1','name2']]
。(我想知道为什么他们的行为有所不同。)
df.col1
?对于选择列的非常简单的情况,所有这三个属性基本上都是等效的。.loc
除了选择一列,您还可以做更多的事情。可能是stackoverflow.com/questions/31593201/…的