代码之家  ›  专栏  ›  技术社区  ›  Marco

将pandas列值设置为数组

  •  2
  • Marco  · 技术社区  · 6 年前

    我有以下问题: 我有一个这样的数据框架:

       col1   col2   col3
    0   2       5      4
    1   4       3      5
    2   6       2      7 
    

    现在我有了一个数组,例如a=[5,5,5],我想在第3列中插入这个数组,但只在特定的行中插入(比如0和2),并得到如下结果:

       col1   col2   col3
    0   2       5    [5,5,5]
    1   4       3      5
    2   6       2    [5,5,5]
    

    问题是,当我尝试这样做时:

     zip_df.at[[0,2],'col3'] = a 
    

    我收到以下错误 ValueError: Must have equal len keys and value when setting with an ndarray . 我怎样才能解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  3
  •   jpp    6 年前

    不建议您尝试什么。 熊猫并不是被设计成一系列地保存列表。这样,您就可以显式定义一个系列并通过 update loc . 注释 at 用于获取或设置 单值 只是,不是像您的情况那样有多个值。

    a = [5, 5, 5]
    indices = [0, 2]
    
    df['col3'].update(pd.Series([a]*len(indices), index=indices))
    
    # alternative:
    # df.loc[indices, 'col3'] = pd.Series([a]*len(indices), index=indices)
    
    print(df)
    
       col1  col2       col3
    0     2     5  [5, 5, 5]
    1     4     3          5
    2     6     2  [5, 5, 5]
    

    更多信息( source ):

    不要这样做 .熊猫从来没有被设计成在系列/列中保存列表。你可以编造昂贵的解决办法,但这些不是 推荐。

    不建议连续保存列表的主要原因是丢失 使用连续内存块中的numpy数组附带的矢量化功能。你的系列将是 object 表示一系列指针的数据类型,类似于 list . 你会失去 在记忆和性能方面的好处,以及对优化熊猫方法的访问。

    也见 What are the advantages of NumPy over regular Python lists? 赞成大熊猫的论据与支持努比的论据相同。