为什么我们要对pandas数据帧使用'loc'?下面的代码无论是否使用loc都以模拟的速度编译和运行
%timeit df_user1 = df.loc[df.user_id=='5561']
100 loops, best of 3: 11.9 ms per loop
或者
%timeit df_user1_noloc = df[df.user_id=='5561']
100 loops, best of 3: 12 ms per loop
那为什么要用loc呢?
编辑:此问题已标记为重复问题。但尽管pandas iloc vs ix vs loc explanation?确实提到了这一点*
you can do column retrieval just by using the data frame's getitem:
*
df['time'] # equivalent to df.loc[:, 'time']
它没有说明我们为什么使用loc,虽然它确实解释了loc的许多特性,但我的具体问题是“为什么不干脆完全省略loc”?对此我接受了下面一个非常详细的回答。
另外,其他帖子的答案(我不认为是答案)在讨论中隐藏得很深,任何人在搜索我正在寻找的内容时,都会发现很难找到这些信息,而我的问题的答案会更好地为他们服务。
显式比隐式好。
df[boolean_mask]
选择boolean_mask
为真的行,但在您可能不希望它为真的情况下有一个角点大小写:当df
具有布尔值列标签时:您可能需要使用
df[[True]]
来选择True
列。相反,它引发了一个ValueError
:与使用
loc
相比:相反,尽管
df2
的结构与上面的df1
几乎相同,但下面的内容并没有提高ValueError
:因此,
df[boolean_mask]
的行为并不总是与df.loc[boolean_mask]
相同。尽管这可能是一个不太可能的用例,但我还是建议始终使用df.loc[boolean_mask]
,而不是df[boolean_mask]
,因为df.loc
语法的含义是明确的。使用df.loc[indexer]
可以自动知道df.loc
正在选择行。相反,不清楚df[indexer]
是否会在不知道indexer
和df
详细信息的情况下选择行或列(或提升ValueError
)。df.loc[row_indexer, column_index]
可以选择行和列。df[indexer]
只能根据indexer
中的值类型和df
中的列值类型(同样,它们是布尔值吗?)选择行或列。当切片传递到
df.loc
时,端点包含在范围中。当一个切片被传递到df[...]
时,该切片被解释为半开放间隔:相关问题 更多 >
编程相关推荐