【发布时间】: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