gpt4 book ai didi

Python: Pandas 系列 - 为什么使用 loc?

转载 作者:IT老高 更新时间:2023-10-28 20:34:32 26 4
gpt4 key购买 nike

为什么我们对 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 所在的行是 True,但是当您可能不希望它时,有一个极端情况:当 df具有 bool 值的列标签:

    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

    相比之下,以下不引发 ValueError即使 df2 的结构与 df1 几乎相同以上:

    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]将选择行或列(或提高 ValueError )而不知道有关 indexer 的详细信息和 df .

  • df.loc[row_indexer, column_index]可以选择行列。 df[indexer]只能根据 indexer 中的值类型选择行 列以及列值的类型 df有(再次,它们是 bool 值吗?)。

    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

关于Python: Pandas 系列 - 为什么使用 loc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38886080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com