大Pandas系列-为什么使用loc?

2024-06-07 13:53:12 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么我们要对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”?对此我接受了下面一个非常详细的回答。

另外,其他帖子的答案(我不认为是答案)在讨论中隐藏得很深,任何人在搜索我正在寻找的内容时,都会发现很难找到这些信息,而我的问题的答案会更好地为他们服务。


Tags: of答案loopidpandasdflocms
1条回答
网友
1楼 · 发布于 2024-06-07 13:53:12
  • 显式比隐式好。

    df[boolean_mask]选择boolean_mask为真的行,但在您可能不希望它为真的情况下有一个角点大小写:当df具有布尔值列标签时:

    In [229]: df = pd.DataFrame({True:[1,2,3],False:[3,4,5]}); df
    Out[229]: 
       False  True 
    0      3      1
    1      4      2
    2      5      3
    

    您可能需要使用df[[True]]来选择True列。相反,它引发了一个ValueError

    In [230]: df[[True]]
    ValueError: Item wrong length 1 instead of 3.
    

    与使用loc相比:

    In [231]: df.loc[[True]]
    Out[231]: 
       False  True 
    0      3      1
    

    相反,尽管df2的结构与上面的df1几乎相同,但下面的内容并没有提高ValueError

    In [258]: df2 = pd.DataFrame({'A':[1,2,3],'B':[3,4,5]}); df2
    Out[258]: 
       A  B
    0  1  3
    1  2  4
    2  3  5
    
    In [259]: df2[['B']]
    Out[259]: 
       B
    0  3
    1  4
    2  5
    

    因此,df[boolean_mask]的行为并不总是与df.loc[boolean_mask]相同。尽管这可能是一个不太可能的用例,但我还是建议始终使用df.loc[boolean_mask],而不是df[boolean_mask],因为df.loc语法的含义是明确的。使用df.loc[indexer]可以自动知道df.loc正在选择行。相反,不清楚df[indexer]是否会在不知道indexerdf详细信息的情况下选择行或列(或提升ValueError)。

  • df.loc[row_indexer, column_index]可以选择行列。df[indexer]只能根据indexer中的值类型和df中的列值类型(同样,它们是布尔值吗?)选择行列。

    In [237]: df2.loc[[True,False,True], 'B']
    Out[237]: 
    0    3
    2    5
    Name: B, dtype: int64
    
  • 当切片传递到df.loc时,端点包含在范围中。当一个切片被传递到df[...]时,该切片被解释为半开放间隔:

    In [239]: df2.loc[1:2]
    Out[239]: 
       A  B
    1  2  4
    2  3  5
    
    In [271]: df2[1:2]
    Out[271]: 
       A  B
    1  2  4
    

相关问题 更多 >

    热门问题