【问题标题】:pandas - merging with missing valuespandas - 与缺失值合并
【发布时间】:2014-07-19 08:42:11
【问题描述】:

熊猫合并功能似乎有一个怪癖。它认为NaN 值相等,并将NaNs 与其他NaNs 合并:

>>> foo = DataFrame([
    ['a',1,2],
    ['b',4,5],
    ['c',7,8],
    [np.NaN,10,11]
], columns=['id','x','y'])

>>> bar = DataFrame([
    ['a',3],
    ['c',9],
    [np.NaN,12]
], columns=['id','z'])

>>> pd.merge(foo, bar, how='left', on='id')
Out[428]: 
    id   x   y   z
0    a   1   2   3
1    b   4   5 NaN
2    c   7   8   9
3  NaN  10  11  12

[4 rows x 4 columns]

这与我见过的任何 RDB 不同,通常缺失的值会被视为不可知论,并且不会像它们相等一样合并在一起。这对于具有稀疏数据的数据集尤其成问题(每个 NaN 都将合并到每个其他 NaN,从而产生巨大的 DataFrame!)

有没有办法在合并过程中忽略缺失值而不先将它们切掉?

【问题讨论】:

    标签: python merge pandas missing-data


    【解决方案1】:

    您可以排除 bar 中的值(如果您愿意,还可以排除 foo),其中 id 在合并期间为空。不过,不确定这是您所追求的,因为它们已被切掉。

    (我从您的左连接中假设您有兴趣保留所有foo,但只想合并bar 中匹配且不为空的部分。)

    foo.merge(bar[pd.notnull(bar.id)], how='left', on='id')
    
    Out[11]: 
    id   x   y   z
    0    a   1   2   3
    1    b   4   5 NaN
    2    c   7   8   9
    3  NaN  10  11 NaN
    

    【讨论】:

    • 这基本上是我现在正在做的一种变通方法。我想知道是否有一个选项可以阻止熊猫似乎做的NaN 匹配行为。
    • 啊,对不起。我不知道,但谈到熊猫似乎总是有新的东西要学。 :)
    • 非常感谢 'bar[pd.notnull(bar.id)]' 工作。 :)
    • 这正是我想要的。非常感谢。
    【解决方案2】:

    如果左右DF都不需要NaN,则使用

    pd.merge(foo.dropna(subset=['id']), bar.dropna(subset=['id']), how='left', on='id')

    如果在左 DF 中需要 NaN,则使用

    pd.merge(foo, bar.dropna(subset=['id']), how='left', on='id')
    

    【讨论】:

    • 这是一个糟糕的答案,因为它不能概括。 dropna() 将删除任何列包含 NaN 值的所有行,这与预期的行为大不相同。您需要将其子集到合并列!
    【解决方案3】:

    如果您想保留两个表中的 NaN 而不将它们分割出来,您可以使用如下外连接方法:

    pd.merge(foo, bar.dropna(subset=['id']), how='outer', on='id')
    

    它基本上返回foobar的联合

    【讨论】:

    • 这是一个糟糕的答案,因为它不能一概而论。 dropna() 将删除任何列包含 NaN 值的所有行,这与预期的行为大不相同。您需要将其子集到合并列中,
    • 不错,已修复。
    【解决方案4】:

    另一种方法,如果执行外连接,也会保留所有行:

    foo['id'] = foo.id.fillna('missing')
    pd.merge(foo, bar, how='left', on='id')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多