【问题标题】:NaNs after merging two dataframes合并两个数据帧后的 NaN
【发布时间】: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)
  • 是的,确实是问题所在!谢谢!!

标签: python pandas


【解决方案1】:

问题是您需要将df2 中的列id 转换为int,因为string 函数的输出始终为string,如果与数字一起使用也是如此。

df2.id = df2.id.astype(int)

另一种解决方案是将df1.id 转换为string

df1.id = df1.id.astype(str)

并得到NaNs,因为不匹配 - str 值与 int 值不匹配。

【讨论】:

  • 是的,6 个月前我找不到这个问题 - 仍然是 NaN,一切看起来都很好。但 2 小时后我找到了解决方案 - 我一直记得它;)
  • 哈哈,你真的很棒!您几乎可以解决我的所有疑问!
猜你喜欢
  • 2020-03-12
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
相关资源
最近更新 更多