【问题标题】:Pandas merge filling new dataframe with null values熊猫合并用空值填充新数据框
【发布时间】:2019-11-30 21:42:30
【问题描述】:

我正在尝试合并两个数据框:

  • 第一个数据帧 control 填充有 INTEGERS/STRINGS
  • 左边的数据框一起填充了 INTEGERS/LISTS

当我使用 pandas merge() 函数时,新数据框用 NaN 填充正确的数据框,而不是列表

final_dataset = pd.merge(control, together, on="zip_code", how="left")

我期望一个新的合并数据帧,其中包含两个原始数据帧的值。相反,在新数据框中,“控制”数据框中的所有值都是正确的,但“一起”数据框中的所有列表都是 NaN

这是一些示例数据:

control                                       together
-------------------------------              -------------------------------
payment             zip_code                   age                  zip_code
   Rent                 94053                    [25, 64, 24]         12583
   Mortgage             47283                    [78. 39, 35]         47283
   Rent                 25769                    [82, 33, 19]         25769

这是最终数据集的样子:

final_dataset
-----------------------------------------------------------
zip_code             payment                 age                  
47283                  Mortgage               NaN                 
25769                  Rent                   NaN                                

【问题讨论】:

  • 请提供一些示例数据。
  • 当您执行内部联接how='inner' 时,您会获得任何价值吗?可能是 id 不匹配。
  • @iuvbio 添加了一些示例代码
  • @minanmafi 您应该使用pd.merge(control, together, on="zip_code", how="inner") 检查您是否得到任何结果并将其添加到问题中。如果没有,那么您的 zip_code 值实际上并不相同。
  • 请提供control.zip_code.dtypetogether.zip_code.dtype的输出

标签: python pandas dataframe merge null


【解决方案1】:

我认为您在这里发生了一些事情。当您说左侧数据框时,我假设您的意思是它应该是左侧连接的右侧?您不是说样本中的“together”在左侧吗?

我认为可以安全地假设您在“together”中的 zip_code 是字符串而不是“int”。您得到的是 NaN,因为它们在 2 个数据帧中不匹配,例如 47283 不等于“47283”。

另外,如果它是你想要的左连接并且一起在左边,你应该有 1 个 NaN 付款,因为如果它们是相同的数据类型,你只有 2 个匹配的 zip_codes。

如果您想控制左侧(我想您会这样做),我建议您这样做:

control = pd.DataFrame({
    'payment':['Rent','Mortgage','Rent'],
    'zip_code':[94053,47283,25769]
})
together = pd.DataFrame({
    'age':[[25,64,24],[78, 39,35],[82,33,19]],
    'zip_code':[12583,47283,25769]
})

control.merge(together,on='zip_code',how='left')

这将为您提供以下结果:

    payment  zip_code           age
0      Rent     94053           NaN
1  Mortgage     47283  [78, 39, 35]
2      Rent     25769  [82, 33, 19]

如您所见,您的年龄为 1 NaN,因为 94053 不在“together”数据帧中。

【讨论】:

    【解决方案2】:

    如果每个数据帧的 zip_code 列具有不同的类型,可能会发生这种情况,其中一个是 int64,另一个是对象,例如:

     a = pd.DataFrame([
        {"colA": 1, "key": "1"},
        {"colA": 2, "key": "2"},
        {"colA": 3, "key": "3"}
    ])
    
    b = pd.DataFrame([
        {"colB": [25, 64, 24], "key": 1},
        {"colB": [25, 64, 24], "key": 2},
        {"colB": [25, 64, 24], "key": 4}
    ])
    

    如果你合并这两个数据框,你会得到

    res = pd.merge(a, b, on="key", how='left')
    
    
    
       colA key colB
    0   1   1   NaN
    1   2   2   NaN
    2   3   3   NaN
    

    所以你需要确保 zip_code 在两个数据帧中具有相同的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-19
      • 2020-11-13
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      相关资源
      最近更新 更多