【发布时间】:2017-03-14 17:25:39
【问题描述】:
我有两个如下数据框:
df1
id name
-------------------------
0 43 c
1 23 t
2 38 j
3 9 s
df2
user id
--------------------------------------------------
0 222087 27,26
1 1343649 6,47,17
2 404134 18,12,23,22,27,43,38,20,35,1
3 1110200 9,23,2,20,26,47,37
我想将 df2 中的所有 id 拆分为多行,并将生成的数据框连接到“id”上的 df1。
我执行以下操作:
b = pd.DataFrame(df2['id'].str.split(',').tolist(), index=df2.user_id).stack()
b = b.reset_index()[[0, 'user_id']] # var1 variable is currently labeled 0
b.columns = ['Item_id', 'user_id']
当我尝试合并时,我在结果数据框中得到了 NaN。
pd.merge(b, df1, on = "id", how="left")
id user name
-------------------------------------
0 27 222087 NaN
1 26 222087 NaN
2 6 1343649 NaN
3 47 1343649 NaN
4 17 1343649 NaN
所以,我尝试执行以下操作:
b['name']=np.nan
for i in range(0, len(df1)):
b['name'][(b['id'] == df1['id'][i])] = df1['name'][i]
它仍然给出与上面相同的结果。我对可能导致这种情况的原因感到困惑,因为我确信它们都应该起作用! 任何帮助将非常感激!
我在 SO 上阅读了类似的帖子,但似乎没有一个具体的答案。我也不确定这是否与编码无关。
提前致谢!
【问题讨论】:
-
我认为问题是原来你有一个字符串然后你分裂了,所以你可能有不兼容的dtypes,试试
b = pd.DataFrame(df2['id'].str.split(',').tolist(), index=df2.user_id).stack().astype(int) -
是的,确实是问题所在!谢谢!!