我注意到在Pandas DataFrame中选择一种列的三种方法:
使用loc选择列的第一种方法:
df_new = df.loc[:, 'col1']
第二种方法 - 看似简单快捷:
df_new = df['col1']
第三种方法 - 最方便:
df_new = df.col1
这三种方法有区别吗?我不这么认为,在这种情况下,我宁愿使用第三种方法。
我很好奇为什么似乎有三种方法可以做同样的事情。
答案 0 :(得分:30)
在以下情况中,它们的行为相同:
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
切片行,而不是{{1假设你有一个RandeIndex,你会得到第1,2和3行。详见here。)但是,iloc
在以下情况下不起作用:
[]
df.loc[row_label]
df.loc[[row_label1, row_label2]]
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']] 。 (我想知道为什么他们的行为有所不同。)