首页 > 解决方案 > 用另一个值更新熊猫数据框的正确方法

问题描述

用另一个数据帧的值更新一个数据帧中的多个列的正确方法是什么?

假设我有这两个数据框:

import pandas as pd

df1 = pd.DataFrame([['4', 'val1', 'val2.4', 'val3.4'],
                    ['5', 'val1', 'val2.5', 'val3.5'],
                    ['6', 'val1', 'val2.6', 'val3.6'],
                    ['7', 'val1', 'val2.7', 'val3.7']],
                   columns=['account_id', 'field1', 'field2', 'field3'])

df2 = pd.DataFrame([['6', 'VAL2.6', 'VAL3.6'],
                    ['5', 'VAL2.5', 'VAL3.5']],
                   columns=['account_id', 'field2', 'field3'])

值得注意的是,df2 只有 d1 的行(以某种随机顺序)和列的子集。

我想用 df2 中的值替换 df1 中的值(它们存在的地方,加入 account_id,ala 一个 SQL UPDATE)。

一种解决方案是

cols_to_update = ['field2', 'field3']
df1.loc[df1.account_id.isin(df2.account_id), cols_to_update] = df2[cols_to_update].values

但这不能处理连接并导致

    account_id    field1    field2    field3
0   4             val1      val2.4    val3.4
1   5             val1      VAL2.6    VAL3.6
2   6             val1      VAL2.5    VAL3.5
3   7             val1      val2.7    val3.7

account_id 6 现在有错误的值。

我的问题是:

  1. 我如何使用索引来完成类似的工作?

  2. 有没有合并重复列时不那么乏味的 merge() 或 join() 解决方案?

标签: python-3.xpandas

解决方案


df2在分配之前对值进行排序,即

cols_to_update = ['field2', 'field3']

df1.loc[df1.account_id.isin(df2.account_id), cols_to_update] = df2.sort_values(['account_id'])[cols_to_update].values

   account_id field1  field2  field3
0          4   val1  val2.4  val3.4
1          5   val1  VAL2.5  VAL3.5
2          6   val1  VAL2.6  VAL3.6
3          7   val1  val2.7  val3.7

推荐阅读