我有两个熊猫数据框。一个是来源,另一个是目的地。我想基于多个条件更新两个数据帧的值。源数据帧如下所示:
Old_ID New_ID DATE dt_insert
FIRM345 FIRM21 21.11.19 11.11.19
FIRM321 FIRM41 19.10.19 18.10.19
目标数据框如下所示
Old_ID New_ID DATE
FIRM345 FIRM21 21.11.19
FIRM321 FIRM41 19.10.19
我想知道是否有一种方法可以在不使用循环的情况下应用以下逻辑:
如果src.old_ID == dest.old_id AND src.new_id == dest.new_id AND src.date == dest.date
然后dest.dt_insert = src.date
ELSE将src行附加到目标数据帧
您可以使用以下方法解决您的问题:
dt_insert
列中的值替换列中的值DATE
;删除辅助列_merge
。
import pandas as pd
src_data = [{'Old_ID': 'FIRM345', 'New_ID': 'FIRM21', 'DATE': '21.11.19', 'dt_insert': '11.11.19'},
{'Old_ID': 'FIRM321', 'New_ID': 'FIRM41', 'DATE': '19.10.19', 'dt_insert': '18.10.19'},
{'Old_ID': 'FIRM333', 'New_ID': 'FIRM31', 'DATE': '20.10.19', 'dt_insert': '20.10.19'}]
dest_data = [{'Old_ID': 'FIRM345', 'New_ID': 'FIRM21', 'DATE': '21.11.19'},
{'Old_ID': 'FIRM321', 'New_ID': 'FIRM41', 'DATE': '19.10.19'}]
df_src = pd.DataFrame(src_data)
print(df_src)
# DATE New_ID Old_ID dt_insert
# 0 21.11.19 FIRM21 FIRM345 11.11.19
# 1 19.10.19 FIRM41 FIRM321 18.10.19
# 2 20.10.19 FIRM31 FIRM333 20.10.19
df_dest = pd.DataFrame(dest_data)
print(df_dest)
# DATE New_ID Old_ID
# 0 21.11.19 FIRM21 FIRM345
# 1 19.10.19 FIRM41 FIRM321
df_dest_new = pd.merge(left=df_dest, right=df_src, how='outer',
on=['Old_ID', 'New_ID', 'DATE'], indicator=True)
df_dest_new['dt_insert'] = df_dest_new[['DATE', 'dt_insert', '_merge']].apply(lambda x: x[0] if x[2] == 'both' else x[1], axis=1)
df_dest_new = df_dest_new.drop(labels='_merge', axis=1)
print(df_dest_new)
# DATE New_ID Old_ID dt_insert
# 0 21.11.19 FIRM21 FIRM345 21.11.19
# 1 19.10.19 FIRM41 FIRM321 19.10.19
# 2 20.10.19 FIRM31 FIRM333 20.10.19
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句