如何聚合映射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的值,只是为了在列表中有多个值。
我不知道如何用文字表达我的问题,所以没法具体搜索。我搜索了一段时间,但找不到适合我问题的解决方案。我知道我可以通过多次遍历所有行来创建自定义解决方案,但我希望有更有效的方法来解决问题。这是我的数据框:
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()
所以 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的值,只是为了在列表中有多个值。