[英]Replace values in one df from another on an ID col based on condition
Input:
d1 = {'col1': ['a','b','c','d'], 'col2': [1,2,3,4]}
d2 = {'col1': ['a','b','c'], 'col2': [0,3,4]}
df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)
Desired Output:
d3 = {'col1': ['a','b','c','d'], 'col2': [1,3,4,4]}
df1 = pd.DataFrame(d3)
所以我想用'col1'作为主键替换df1中的值,只有当值更大时才使用df2中的值。 2个数据框的大小不同。
这是一个想法,使用clip
作为从df2
到df1['col1']
的值的map
的下限
df1['col3'] = df1['col2'].clip(lower=df1['col1'].map(df2.set_index('col1')['col2']))
print(df1)
# col1 col2 col3
# 0 a 1 1
# 1 b 2 3
# 2 c 3 4
# 3 d 4 4
您可以concat
并获得每行的max
:
df1['col2'] = pd.concat([df1['col2'], df2['col2']], axis=1).max(1)
Output:
col1 col2
0 a 1.0
1 b 3.0
2 c 4.0
3 d 4.0
注意。 这适用于任意数量的数据帧作为输入
使用更新 function,您可以使用另一个 dataframe 的某些列更改数据框的列。 其更大的逻辑可以通过具有适当合并类型的合并来完成:
dm= df1.merge(df2,on="col1").query("col2_x<col2_y").set_index("col1")[["col2_y"]].rename(columns={"col2_y":"col2"})
df1.set_index("col1", inplace=True)
df1.update(dm)
df3= df1.reset_index()
让我们做 append 然后groupby
out = df1.append(df2).groupby('col1',as_index=False).max()
col1 col2
0 a 1
1 b 3
2 c 4
3 d 4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.