【问题标题】:Why does pandas merge on NaN?为什么熊猫会在 NaN 上合并?
【发布时间】:2019-05-10 08:50:47
【问题描述】:

我最近问了一个关于熊猫here 中缺失值的问题,并被定向到github issue。阅读完该页面和missing data documentation

我想知道为什么 mergejoin 在“它们不比较相等”时将 NaN 视为匹配:np.nan != np.nan

# merge example
df = pd.DataFrame({'col1':[np.nan, 'match'], 'col2':[1,2]})
df2 = pd.DataFrame({'col1':[np.nan, 'no match'], 'col3':[3,4]})
pd.merge(df,df2, on='col1')

    col1    col2    col3
0   NaN      1       3

# join example with same dataframes from above
df.set_index('col1').join(df2.set_index('col1'))

      col2  col3
col1        
NaN     1   3.0
match   2   NaN

但是,groupby 中的 NaN 被排除在外:

df = pd.DataFrame({'col1':[np.nan, 'match', np.nan], 'col2':[1,2,1]})
df.groupby('col1').sum()

       col2
col1    
match   2

当然你可以dropna()df[df['col1'].notnull()] 但我很好奇为什么NaNs 被排除在像groupby 这样的一些pandas 操作中而不是像mergejoinupdate 和@ 这样的其他操作中987654336@?

基本上,正如我上面所问的,为什么 mergejoin 在比较不相等时匹配 np.nan

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    是的,这绝对是一个错误。请参阅GH22491,它准确记录了您的问题,GH22618 指出,None 也观察到了该问题。根据讨论,这似乎不是预期的行为。

    快速源代码分析表明问题 *可能* 存在于 pandas/core/reshape/merge.py 中的 _factorize_keys 函数中。此函数似乎对键进行因式分解以确定要相互匹配的行。

    具体来说,这部分

    # NA group
    lmask = llab == -1
    lany = lmask.any()
    rmask = rlab == -1
    rany = rmask.any()
    
    if lany or rany:
        if lany:
            np.putmask(llab, lmask, count)
        if rany:
            np.putmask(rlab, rmask, count)
        count += 1
    

    ...似乎是罪魁祸首。 NaN 键被识别为有效类别(类别值等于 count)。

    免责声明:我不是熊猫开发者,这只是我的猜测;所以真正的问题可能是别的。但乍一看,好像是这样的。

    【讨论】:

    • 同意这不是正确的行为,尤其是当我们与 SQL 或其他语言进行比较时。我真的认为他们至少应该在使用 df.merge() 时发出警告。只是为了确认这仍在 github 开发者页面中讨论,问题编号现在是:github.com/pandas-dev/pandas/issues/…
    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 2021-10-25
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2013-07-31
    相关资源
    最近更新 更多