代码之家  ›  专栏  ›  技术社区  ›  It_is_Chris

大熊猫为什么会在南部合并?

  •  16
  • It_is_Chris  · 技术社区  · 7 年前

    我最近问了一个关于熊猫价值缺失的问题 here 并被指示 github issue . 看完那一页后 missing data documentation .

    我想知道为什么 merge join 当“他们的比较不相等”时,将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 被排除在外:

    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()] 但我很好奇为什么在一些熊猫行动中不包括奶奶 子句 而不是其他人喜欢 合并 , 参加 , update ,和 map ?

    基本上,正如我上面所问的,为什么 合并 参加 匹配 np.nan 当它们不相等时?

    1 回复  |  直到 7 年前
        1
  •  4
  •   cs95 abhishek58g    7 年前

    是的,这是 一定地 臭虫见 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
    

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

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