首页 > 解决方案 > 为什么熊猫会在 NaN 上合并?

问题描述

我最近在这里问了一个关于 pandas 中缺失值的问题,并被定向到了一个github 问题。通读该页面和缺失的数据文档后。

我想知道为什么当“它们不比较相等”时将 NaN 视为匹配项mergejoinnp.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()]但我很好奇为什么 NaN 被排除在一些 pandas 操作中groupby,比如merge, join,updatemap?

本质上,正如我上面所问的,为什么当它们比较不相等时mergejoin匹配?np.nan

标签: pythonpython-3.xpandas

解决方案


是的,这绝对是一个错误。请参阅GH22491准确记录您的问题,以及GH22618指出问题也可以通过None. 根据讨论,这似乎不是预期的行为。

快速的来源潜水表明问题 *可能*_factorize_keyspandas/core/reshape/merge.py. 此函数似乎对键进行因式分解以确定要相互匹配的行。

具体来说,这部分

# 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)。

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


推荐阅读