从另一个数据帧有条件地更新熊猫数据帧

时间:2021-01-20 20:53:15

标签: python pandas

我有一个包含两组值的主数据框:

df1 = pd.DataFrame({'id1': [1, 1, 2, 2],
               'dir1': [True, False, True, False],
               'value1': [55, 40, 84, 31],
               'id2': [3, 3, 4, 4],
               'dir2': [True, False, False, True],
               'value2': [60, 30, 7, 15]})

   id1   dir1  value1  id2   dir2  value2
0    1   True      55    3   True      60
1    1  False      40    3  False      30
2    2   True      84    4  False       7
3    2  False      31    4   True      15

然后我有一个如下所示的更新数据框:

df2 = pd.DataFrame({'id': [1, 2, 3, 4],
               'value': [21, 22, 23, 24]})
   id  value
0   1     21
1   2     22
2   3     23
3   4     24

我想用 df2 的新值更新 df1,但仅当 dirX 为 True 时。数据应如下所示:

   id1   dir1  value1  id2   dir2  value2
0    1   True     *21    3   True     *23
1    1  False      40    3  False      30
2    2   True     *22    4  False       7
3    2  False      31    4   True     *24

知道这样的事情是否可能吗?我尝试查看 .update 但我无法让它工作。我对 python 还很陌生,只在 23:00 编码,所以也许我没有像我需要的那样敏锐。

2 个答案:

答案 0 :(得分:1)

我同意泰勒斯的回答。首先,您根据 id1 将 df2 与 df1 合并:

df = df1.merge(df2, left_on='id1', right_on='id')

然后,您将基于 value1dir1 替换为 value

df.value1 = np.where(df.dir1 == True, df.value, df.value1)

然后,删除多余的列

df = df.drop(['id', 'value'],axis=1)

然后,您根据 id2 将 df2 与 df1 合并:

df = df.merge(df2, left_on='id2', right_on='id')

做同样的替换,但对于 value2

df.value2 = np.where(df.dir2 == True, df.value, df.value2)

然后,删除多余的列:

df = df.drop(['id', 'value'],axis=1)

生成的数据框将如下所示:

   id1   dir1  value1  id2   dir2  value2
0    1   True      21    3   True      23
1    1  False      40    3  False      30
2    2   True      22    4  False       7
3    2  False      31    4   True      24

答案 1 :(得分:0)

尝试使用 numpy 中的 np.where 函数。

也许是这样的:

df_1['value1'] = np.where(df_1['dir2'] == True, df_2['value'], df_1['value1'])

也许您需要进行一些调整或合并,但我认为这会帮助您找到解决方案。

相关问题