数据框1
df1 = pd.DataFrame([[1221,"aptq",[{'id': 100051}, {'id': 100050}]]], columns = ["offid","name","sub_ids"])
offid name sub_ids
0 1221 aptq [{'id': 100051}, {'id': 100050}]
数据框2
df2 = pd.DataFrame([[100051, "zonal"], [100050, "upper"],
[100056, "capital | national"]], columns=["id", "name"])
id name
0 100051 zonal
1 100050 upper
2 100056 capital | national
结果数据框
offid name sub_ids
1221 aptq [zonal, upper]
想用DataFrame 2中ID的名称替换Dataframe 1中sub_ids列中的值,以获得类似于Result Dataframe的结果。任何帮助将不胜感激。
答案 0 :(得分:3)
在sub_ids
上使用Series.explode
,然后在列sub_ids
上使用Series.str.get
从字典中提取与键id
关联的值,然后使用{{ 3}}将ids
映射到df2
中的名称,并在level=0
和agg
上使用list
上的Series.map
:
names = (
df1['sub_ids'].explode().str.get('id')
.map(df2.set_index('id')['name']).groupby(level=0).agg(list)
)
df = df1.assign(sub_ids=names)
结果:
print(df)
offid name sub_ids
0 1221 aptq [zonal, upper]
答案 1 :(得分:1)
您可以使用以下内容:
df1 = pd.DataFrame([[1221,"aptq",[{'id': 100051}, {'id': 100050}]]], columns = ["offid","name","sub_ids"])
df2 = pd.DataFrame([[100051,"zonal"],
[100050,"upper"],
[100056,"capital | national"]], columns = [ "id","name"])
df2 = df2.set_index("id").T.to_dict(orient='records')[0]
现在,我们只创建一个列表,然后在字典中查找它:
df1["sub_ids"] = df1["sub_ids"].apply(lambda row: [item for sublist in [list(row[i].values()) for i in range(len(row))] for item in sublist] if len(row) > 0 else "-")
df1["sub_ids"] = df1["sub_ids"].apply(lambda row: [df2[row[i]] for i in range(len(row))] if len(row)>0 else "-")
df1
offid name sub_ids
0 1221 aptq [zonal, upper]