我有两个数据集:
一个ID可以更改的(df1):
|many_id|data1|data2|
-------------------
|abc |value|value|
|efg |value|value|
具有唯一标识符映射器(df2)的一个
|unique_id|[many_id] |
-------------------------
|123 |[hij, abc] |
|234 |[klm, nop, qrs]|
|345 |[efg] |
我希望能够将many_id映射到unique_id:
|many_id|data1|data2|unique_id|
-----------------------------
|abc |value|value|123 |
|efg |value|value|345 |
例如,在可能的最快过程中,如果可能,将df1的many_id合并到df2的[many_id]数组。
我使用的方法是将many_id分解为几行:
|unique_id|many_id|
|123 |hij |
|123 |abc |
|234 |klm |
|234 |nop |
|234 |qrs |
|345 |efg |
然后根据many_id从那里进行合并,但不确定是否是最有效的合并方法,因为我将数据框放大了很多。
谢谢!
答案 0 :(得分:1)
IIUC,展平df2,然后创建map
数据框
df1.many_id.map(dict(zip(mapdf['many_id'],mapdf['unique_id'])))
Out[158]:
0 123
1 345
Name: many_id, dtype: int64
#df1['unique_id'] = df1.many_id.map(dict(zip(mapdf['many_id'],mapdf['unique_id'])))
更新您可以使用它来获取您提到的内容
newdf=pd.DataFrame({'unique_id':df2['unique_id'].repeat(df2.many_id.str.len()),'many_id':np.concatenate(df2.many_id.values)})
newdf
Out[174]:
many_id unique_id
0 hij 123
0 abc 123
1 klm 234
1 nop 234
1 qrs 234
2 efg 345
答案 1 :(得分:1)
转换您的df2
,使其成为一个表格,其中每个many_id
都位于自己的行上:
d = df2.set_index("unique_id")["many_id"].apply(pd.Series)
many_ids = d.stack().dropna().to_frame("many_id").reset_index()
df1.join(many_ids.set_index("many_id")["unique_id"], on="many_id")
结果:
many_id data1 data2 unique_id
0 abc value value 123
1 efg value value 345