熊猫:将许多ID映射到唯一ID

时间:2018-07-30 23:35:59

标签: pandas

我有两个数据集:

一个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从那里进行合并,但不确定是否是最有效的合并方法,因为我将数据框放大了很多。

谢谢!

2 个答案:

答案 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