首页 文章

为什么熊猫在NaN上合并?

提问于
浏览
13

我最近问了一个关于pandas here中缺失值的问题,并被定向到github issue . 通读该页面和missing data documentation后 .

我想知道 mergejoin 为什么 mergejoin 将NaNs视为匹配"they don't compare equal": 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被排除在某些pandas操作中,如 groupby 而不是其他像 mergejoinupdatemap

基本上,正如我上面提到的,为什么 mergejoin 匹配 np.nan 时它们不比较相等?

1 回答

  • 2

    是的,这绝对是个错误 . 请参阅GH22491,其中列出了您的问题,GH22618注意到 None 也出现了问题 . 根据讨论,这似乎不是预期的行为 .

    快速消息显示问题* might *位于 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 ) .

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

相关问题