熊猫合并用空值填充新数据框

Posted

技术标签:

【中文标题】熊猫合并用空值填充新数据框【英文标题】: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的输出 【参考方案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 在两个数据帧中具有相同的类型。

【讨论】:

以上是关于熊猫合并用空值填充新数据框的主要内容,如果未能解决你的问题,请参考以下文章

数据框空值在 UDF 之后转换为 0。为啥?

Spark DataFrame 数据框空值判断和处理

antdesign选择框空值没有提示

如何在熊猫数据框中仅填充选定列的空值? [复制]

熊猫通过该类别的平均值填充空值(使用循环?)

迭代填充空熊猫