【问题标题】:Merging pandas dataframe while replacing values and np.nans?在替换值和 np.nans 时合并熊猫数据框?
【发布时间】:2022-01-12 19:32:09
【问题描述】:

我有一个旧数据集,该数据集已用新的观察结果和新字段进行了更新。我想合并这两个数据集,但两个数据集之间存在一些差异。

如您所见,id 1 和 2 在新数据集中的值为 0,但我希望旧值覆盖它

df_old = id   value   color              df_new = id   value   color   size
          1     100     b                          1     0       b      4
          2     100     b                          2     0       b      4  
          3     100     b                          3    100      b      4
          4     100     b                          4    100      b      4
          5     100     b                          7    100      b      4
          6     100     b                          8    100      b      4

我希望最终输出看起来像

df_success  = id   value   color   size
               1    100      b      4
               2    100      b      4
               3    100      b      4
               4    100      b      4
               5    100      b      np.nan
               6    100      b      np.nan
               7    100      b      4
               8    100      b      4

我的尝试涉及对 id 进行外部合并,并为 lambda 提供自定义函数以替换 0 和 nans

df_trial = pd.merge(df_old, df_new, how='outer', on='id')

df_trial = id  value_x   color_x    value_y   color_y   size
            1   100        b          0         b         4
            2   100        b          0         b         4
            3   100        b         100        b         4
            4   100        b         100        b         4
            5   100        b         np.nan     np.nan    np.nan
            6   100        b         np.nan     np.nan    np.nan
            7   np.nan     np.nan    100        b         4 
            8   np.nan     np.nan    100        b         4

我会跑

def get_values(values_x, values_y):
    if values_y == 0 or values_y == np.nan
        return values_x
    else:
        return values_y

df_hopeful['value_xy'] = df_trial.apply(lambda x:get_values(x['value_x'], x['value_y']), axis=1)

#and similarly for the color column to get rid of NaNs I will do this with an identical function #called 'get_color'

df_hopeful == id  value_x   color_x    value_y   color_y   size     value_xy   color_xy
               1   100        b          0         b         4         100        b
               2   100        b          0         b         4         100        b
               3   100        b         100        b         4         100        b
               4   100        b         100        b         4         100        b
               5   100        b         np.nan     np.nan    np.nan    100        b
               6   100        b         np.nan     np.nan    np.nan    100        b
               7   np.nan     np.nan    100        b         4         100        b
               8   np.nan     np.nan    100        b         4         100        b

然后我会手动删除在合并期间创建的额外 _x 和 _y 列...

是否有另一种/更有效的方法来解决此类问题?非常感谢您的反馈。谢谢。

【问题讨论】:

    标签: python pandas dataframe join merge


    【解决方案1】:

    如果我是你,我会首先操作 df_new 并在你的情况下用 100 替换 0,然后推送 pd.merge,如下所示:

    df_new["value"].loc[df_new.value == 0]=100
    
    df_trial = pd.merge(df_old,
                        df_new,
                        how='outer',
                        on=("id", "value", "color")) #<--- 
    
    

    结果如预期:

       id  value color  size
    0   1    100     b   4.0
    1   2    100     b   4.0
    2   3    100     b   4.0
    3   4    100     b   4.0
    4   5    100     b   NaN
    5   6    100     b   NaN
    6   7    100     b   4.0
    7   8    100     b   4.0
    

    【讨论】:

    • 抱歉不清楚,值,颜色,大小可以是任何东西,为了展示示例,我将这些值标准化。
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2019-02-02
    • 2022-06-24
    • 1970-01-01
    • 2018-09-29
    • 2023-01-23
    • 2013-09-26
    相关资源
    最近更新 更多