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

使用多列和不同大小的新数据帧更新旧数据帧的值

  •  0
  • Chronicles  · 技术社区  · 1 年前

    我正在尝试用另一个数据帧更新数据帧。它们具有相同的列,但具有不同的大小。

    old_df = pd.DataFrame({"Primary_ID":[ID1,ID1,ID1,ID2,ID2,ID2,ID3,ID3],"Secondary_ID":[1,2,3,4,5,6,7,8], "Value":[100,200,300,400,5000,600,700,8000]})
    
    new_df = pd.DataFrame({"Primary_ID":[ID3,ID2],"Secondary_ID":[8,5],"Value":[800,500]})
    

    我试图使用更新 old_df.update(new_df) ,但这将以错误的方式计算索引,因为它们具有不同的大小(因此我们必须匹配两个数据帧中除名为“Value”的列之外的所有列的确切值,并以这种方式更新它)

    我还循环浏览了新旧数据帧上的每一行,并试图以这种方式匹配值,但这并不优化,因为这些数据帧的大小与它们相当

    有什么建议吗?

    2 回复  |  直到 1 年前
        1
  •  1
  •   mozway    1 年前

    你不能使用 update 直接来说,更好的方法可能是 merge 要对齐数据帧并设置新值,则 combine_first 要恢复旧值:

    out = new_df.merge(old_df[['Primary_ID', 'Secondary_ID']],
                       on=['Primary_ID', 'Secondary_ID'], how='right'
                       ).combine_first(old_df)
    

    输出:

      Primary_ID  Secondary_ID  Value
    0        ID1             1  100.0
    1        ID1             2  200.0
    2        ID1             3  300.0
    3        ID2             4  400.0
    4        ID2             5  500.0
    5        ID2             6  600.0
    6        ID3             7  700.0
    7        ID3             8  800.0
    
        2
  •  1
  •   Maria K    1 年前

    您可以通过合并2个数据帧并在中搜索非空值来获得必须更新的索引 new_df.Value 像这样:

    merged_df = old_df \
        .merge(new_df, on=["Primary_ID", "Secondary_ID"], how="left")
    
    old_df["Value"].update(
        merged["Value_y"][~merged["Value_y"].isna()].astype(int)
    )
    

    我补充道 .astype(int) 因为pandas将具有NaN的列转换为float。若实际任务中有浮点值,请删除该部分。