为什么熊猫在NaN上合并?

Chr*_*ris 17 python python-3.x pandas

我最近在这里问了一个关于大熊猫遗失值的问题,并且是针对github问题的.阅读完该页面和缺少的数据文档.

我想知道为什么merge并且join当"他们不比较平等"时将NaNs视为匹配: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
Run Code Online (Sandbox Code Playgroud)

但是,NaNs groupby排除在外:

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

       col2
col1    
match   2
Run Code Online (Sandbox Code Playgroud)

当然你也可以dropna()或者df[df['col1'].notnull()]不过我很好奇,为什么NaN是排除像一些熊猫的操作groupby,而不是其他人一样merge,join,update,和map

从本质上讲,正如我上面问,为什么mergejoin比赛上np.nan,当他们不比较相等?

cs9*_*s95 5

是的,这绝对是一个错误。请参阅GH22491(准确记录了您的问题)和GH22618(指出存在该问题)None。根据讨论,这似乎不是预期的行为。

快速的原始资料显示,问题* 可能 *在中的_factorize_keys功能内pandas/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
Run Code Online (Sandbox Code Playgroud)

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

免责声明:我不是熊猫开发者,这仅仅是我的猜测;因此真正的问题可能是其他问题。但是乍看之下,似乎是这样。