繁体   English   中英

根据条件在 ID col 上替换一个 df 中的值

[英]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作为从df2df1['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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM