代码之家  ›  专栏  ›  技术社区  ›  cs95 abhishek58g

将列表插入单元格-为什么loc在这里实际工作?

  •  9
  • cs95 abhishek58g  · 技术社区  · 7 年前

    我们知道设置单个单元格的标准方法是使用 at iat . 然而,我注意到一些有趣的行为,我想知道是否有人可以合理化。

    解决 this question ,我遇到了一些奇怪的行为 loc

    # Setup.
    
    pd.__version__
    # '0.24.0rc1'
    
    df = pd.DataFrame({'A': [12, 23], 'B': [['a', 'b'], ['c', 'd']]})
    df
        A       B
    0  12  [a, b]
    1  23  [c, d]
    

    要设置单元格(1,'B'),只需使用at即可,如 df.at[1, 'B'] = ... . 但对于loc,我最初尝试了这个方法,但没有成功:

    df.loc[1, 'B'] = ['m', 'n', 'o', 'p'] 
    # ValueError: Must have equal len keys and value when setting with an iterable
    

    df.loc[1, 'B'] = [['m', 'n', 'o', 'p']]
    # ValueError: Must have equal len keys and value when setting with an ndarray
    

    我想 loc 代码工作:

    df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p']]
    df
    
        A             B
    0  12        [a, b]
    1  23  [m, n, o, p]
    

    为什么

    df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p', 'q']]
    # ValueError: Must have equal len keys and value when setting with an iterable
    

    空列表也不起作用。将每个元素嵌套在自己的列表中似乎没有意义。

    为什么 loc

    1 回复  |  直到 7 年前
        1
  •  5
  •   Andy Hayden    7 年前

    这是因为 loc 做一个 bunch 检查它支持的所有许多用例。(注:历史就是这样 iloc 是为了消除 ix ,早在2013年v0.11版,但即使在今天,仍然有很多模糊性 loc .)

    df.loc[1, 'B'] 您可以返回:

    • 单个元素(在本例中,当1/'B'有唯一的索引/列时)。
    • 一个系列(如果1/'B'中的任何一个多次出现在索引/列中)。

    旁白: 在这种情况下也会遇到同样的问题,尽管这总是第一种情况,但这可能是因为loc和iloc共享此分配代码。

    所以熊猫需要支持所有这些任务案例!

    In [11]: np.array(['m', 'n', 'o', 'p']).shape
    Out[11]: (4,)
    
    In [12]: np.array([['m', 'n', 'o', 'p']]).shape
    Out[12]: (1, 4)
    

    因此,您不能只是传递列表列表,然后期望得到正确的数组。相反,您可以明确地设置为对象数组:

    In [13]: a = np.empty(1, dtype=object)
    
    In [14]: a[0] = ['m', 'n', 'o', 'p']
    
    In [15]: a
    Out[15]: array([list(['m', 'n', 'o', 'p'])], dtype=object)
    

    In [16]: df.loc[0, 'B'] = a
    
    In [17]: df
    Out[17]:
        A             B
    0  12  [m, n, o, p]
    1  23        [c, d]
    

    这仍然不理想,但重申一下,在中国有太多的边缘案例 loc ,解决方案应尽可能明确以避免它们(使用 at

    推荐文章