首页 > 解决方案 > 从匹配的 id 复制值并附加到新列

问题描述

joinable_id id  title   owner_id    user_id country
0   ffff8f7f-7233-4a79-a651-ec499d0ca888    ffff8f7f-7233-4a79-a651-ec499d0ca888    doctor  4251311 4251311 US
1   ffff8f7f-7233-4a79-a651-ec499d0ca888    ffff8f7f-7233-4a79-a651-ec499d0ca888    doctor  4251311 4251314 US
2   ffff8f7f-7233-4a79-a651-ec499d0ca888    ffff8f7f-7233-4a79-a651-ec499d0ca888    doctor  4251311 4251315 US

我有一个如上所述结构的项目数据集。我需要在条件如下的目的地国家/地区创建一个新列:

检查项目的所有者 id ( joinable id ),转到该行并复制country,将其附加到当前行的目标列。

这可能与Python和Pandas有关吗?

标签: pythonpandas

解决方案


自联接是一种方法(也将在 SQL 中)。但是,您有重复的键,所以还有几个步骤

  • 将同一行删除到同一行.loc[lambda d: d["index"]!=d["index_"]]
  • first()匹配的行
df = pd.read_csv(io.StringIO("""joinable_id id  title   owner_id    user_id country
0   ffff8f7f-7233-4a79-a651-ec499d0ca888    ffff8f7f-7233-4a79-a651-ec499d0ca888    doctor  4251311 4251311 US
1   ffff8f7f-7233-4a79-a651-ec499d0ca888    ffff8f7f-7233-4a79-a651-ec499d0ca888    doctor  4251311 4251314 US
2   ffff8f7f-7233-4a79-a651-ec499d0ca888    ffff8f7f-7233-4a79-a651-ec499d0ca888    doctor  4251311 4251315 US"""), sep="\s+")

(df.reset_index().merge(df.loc[:,["id","country"]].reset_index(), left_on="joinable_id", right_on="id", suffixes=("","_"))
 .drop(columns="id_")
 .loc[lambda d: d["index"]!=d["index_"]]
 .groupby("index", as_index=False).first()
 .drop(columns="index_")
 .rename(columns={"country_":"destination"})
)

推荐阅读