我最近问了一个有关熊猫here缺失值的问题,并被引到github issue。阅读完该页面和missing data documentation之后。
我想知道为什么merge
和join
在“ NaN不相等”时将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()]
,但是我很好奇为什么在某些熊猫操作(如groupby
,而不是诸如merge
,{{ 1}},join
和update
?
本质上,正如我在上面所问的,为什么map
和merge
在join
上匹配时为什么不相等?
答案 0 :(得分:4)
是的,这绝对是一个错误。请参阅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
)。
免责声明:我不是熊猫开发者,这只是我的猜测;因此真正的问题可能是其他问题。但是乍看之下,似乎是这样。