代码之家  ›  专栏  ›  技术社区  ›  Jeff Gordon

如何将列表合并到现有数据帧?

  •  2
  • Jeff Gordon  · 技术社区  · 2 年前

    我正在尝试基于另一列值替换pandas数据帧中的一个值。

    我在下面制作了示例代码来复制这个问题,但本质上我想在现有的数据帧中添加一列,然后根据另一列的值替换占位符信息。我使用的数据帧(不在示例中)基于一个excel文档,该文档将用于根据另一列的值对我希望在新列中返回的信息进行Web抓取。只是想在人们问为什么不开始 ex_list 数据帧中的数据。此外I 只有 希望它替换满足条件的位置,而不是用设置值替换整列。

    示例代码

    ## this would be the excel document df
    sample_df = pd.DataFrame({"a":[1,2,3,4,5]})
    sample_df["b"] = ""
    ## this data would be webscrapped using information above
    ex_list = [[1, "CHANGE"],[4, "CHANGE"]]
    
    for sub in ex_list:
        location = sample_df.loc[sample_df['a']==sub[0], 'b'].iloc[0]
        sample_df.replace(location, sub[1])
    sample.head()
    

    我也试过这只是一个快速的游戏,但它产生了相同的输出

    sample_df = pd.DataFrame({"a":[1,2,3,4,5]})
    sample_df["b"] = ""
    ex_list = [[1, "CHANGE"],[4, "CHANGE"]]
    
    for sub in ex_list:
        sample_df[sample_df['a']==sub[0], 'b'].iloc[0] += sub[1]
    sample_df.head()
    

    两个输出相同且没有变化:

        a   b
    0   1   
    1   2   
    2   3   
    3   4   
    4   5   
    

    我希望的结果是

        a   b
    0   1   CHANGE
    1   2   
    2   3   
    3   4   CHANGE
    4   5   
    

    如果能再多看一眼,我将不胜感激。我的“定位值”方法是否逻辑错误?我认为.loc/.iloc是最好的,但也许另一种索引方式是最好的?我愿意接受任何解决方案!

    3 回复  |  直到 2 年前
        1
  •  3
  •   Timeless    2 年前

    IMHO,这个标题让你的问题 XY .我想你只是想 merge 两个对象:

    # sample_df["b"] = "" # no need for this line anymore
    
    out = sample_df.merge(pd.DataFrame(ex_list, columns=["a", "b"]), how="left")
    

    输出:

    print(out)
    
       a       b
    0  1  CHANGE
    1  2     NaN
    2  3     NaN
    3  4  CHANGE
    4  5     NaN
    
        2
  •  3
  •   BENY    2 年前

    你可以分配

    sample_df.loc[sample_df['a'].isin(list(zip(*ex_list))[0]), 'b'] = 'CHANGE'
    sample_df
       a       b
    0  1  CHANGE
    1  2        
    2  3        
    3  4  CHANGE
    4  5        
    
        3
  •  2
  •   Andrej Kesely    2 年前

    你可以试着 .set_index() 来自哥伦布 a 然后更新数据帧:

    sample_df = sample_df.set_index("a")
    for a, b in ex_list:
        sample_df.loc[a, "b"] = b
    
    print(sample_df.reset_index())
    

    打印:

       a       b
    0  1  CHANGE
    1  2        
    2  3        
    3  4  CHANGE
    4  5