如何聚合映射table?

How to aggregate mapping table?

我不知道如何用文字表达我的问题,所以没法具体搜索。我搜索了一段时间,但找不到适合我问题的解决方案。我知道我可以通过多次遍历所有行来创建自定义解决方案,但我希望有更有效的方法来解决问题。这是我的数据框:

id_old  id_new
A1      A2
A2      A3
A4      A5

这是一个映射table,我想更改第一行,因为 ID 已再次更新。

我寻找这个结果:

id_old  id_new
A1      A3
A2      A3
A4      A5

欢迎任何帮助:-)

最佳

IIUC:

尝试通过 mask()bfill():

df['id_new']=df['id_new'].mask(df['id_new'].isin(df['id_old'])).bfill()

解释:

正在通过 isin()

检查 'id_new' 的值是否在 'id_old' 中

所以 isin() 方法给了我们一个布尔系列,所以我们将该系列传递给 mask() 方法,所以基本上 where where 条件匹配 mask() 方法 put NaN 因为我们将它链接到 'id_new' 列,因此它会给出 NaN mask 中的值为 True 和 False 的地方它将给出 'id_new' column

的值

最后通过 bfill() 方法

填充值

您的数据框:

import pandas as pd
df = pd.DataFrame({"id_old": ["A1", "A2", "A4"], "id_new": ["A2", "A3", "A5"]})

如果只需要修改第一行,直接赋值即可:

#(0: first row, 1: second column):
df.iat[0, 1] = "A3"

或者,您可以按名称查找:

df.loc[df["id_old"] == "A1", "id_new"] = "A3"

或者使用旧 ID 列表和另一个新值列表*:

old_id = ["A1", "A4"]
new_values = ["A3", "A7"]

selection = df["id_old"].isin(old_id)

df.loc[selection, "id_new"] = new_values

*我在这个例子中也修改了A4的值,只是为了在列表中有多个值。